什么是 ASP.NET Identity 的 IUserSecurityStampStore<TUser> 接口?
Posted
技术标签:
【中文标题】什么是 ASP.NET Identity 的 IUserSecurityStampStore<TUser> 接口?【英文标题】:What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface? 【发布时间】:2013-10-29 12:29:10 【问题描述】:查看 ASP.NET Identity(ASP.NET 中的新成员实现),我在实现自己的UserStore
时遇到了这个接口:
//Microsoft.AspNet.Identity.Core.dll
namespace Microsoft.AspNet.Identity
public interface IUserSecurityStampStore<TUser> :
// Methods
Task<string> GetSecurityStampAsync(TUser user);
Task SetSecurityStampAsync(TUser user, string stamp);
IUserSecurityStampStore
由默认的EntityFramework.UserStore<TUser>
实现,它本质上是获取和设置TUser.SecurityStamp
属性。
经过一番挖掘,SecurityStamp
似乎是在UserManager
的关键点处新生成的Guid
(例如,更改密码)。
由于我正在 Reflector 中检查此代码,因此我无法真正破译此内容。几乎所有的符号和异步信息都被优化了。
此外,Google 也没有提供太多帮助。
问题是:
什么是 ASP.NET Identity 中的SecurityStamp
,它的用途是什么?
SecurityStamp
在创建身份验证 cookie 时是否起任何作用?
是否需要对此采取任何安全后果或预防措施?例如,不要将此值向下游发送给客户端?
更新(2014 年 9 月 16 日)
这里有源代码:
https://github.com/aspnet/Identity/ https://github.com/aspnet/Security/【问题讨论】:
@TryingToImprove,新的身份存储和依赖的 OWIN 中间件被设计为高度可定制的。与 SimpleMembership 一样,有一个开箱即用实现利用 SQL Express 上的最新 EF。但是模式、数据查询方法、数据库源,甚至中间件都可以围绕您的特定目的进行定制。更重要的是,MS 发布的实现本身仍在不断发展。这就是为什么每个人都在努力寻找一个具体的定义。 【参考方案1】:这意味着代表您的用户凭据的当前快照。因此,如果没有任何变化,印章将保持不变。但是,如果用户的密码被更改,或者登录被删除(取消链接您的 google/fb 帐户),印章将会改变。这是在发生这种情况时自动签署用户/拒绝旧 cookie 等事情所必需的,这是 2.0 中的一项功能。
Identity 尚未开源,目前仍在筹备中。
编辑:为 2.0.0 更新。因此SecurityStamp
的主要目的是在任何地方启用注销。基本思想是,每当用户更改与安全相关的内容(例如密码)时,自动使任何现有的登录 cookie 无效是一个好主意,因此如果您的密码/帐户先前被泄露,攻击者将不再具有访问权限。
在 2.0.0 中,我们添加了以下配置来挂钩 CookieMiddleware
中的 OnValidateIdentity
方法以查看 SecurityStamp
并在其更改时拒绝 cookie。如果标记未更改,它还会每隔refreshInterval
自动刷新数据库中的用户声明(它负责更改角色等事情)
app.UseCookieAuthentication(new CookieAuthenticationOptions
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
);
如果您的应用想要显式触发此行为,它可以调用:
UserManager.UpdateSecurityStampAsync(userId);
【讨论】:
如果我从 MVC4 表结构迁移数据怎么办?我可以将该字段留空吗?还是会以某种方式把事情搞砸? 您可以让它返回 ID 或其他常量以有效地使其成为无操作。 Null/"" 可能也可以。 UserManager.UpdateSecurityStampAsync(userId) 是否适用于 UseOAuthBearerTokens? 不,OAuthBearerTokens 目前不受影响。UseCookieAuthentication
现在是 deprecated。我设法使用services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));
对其进行了配置。【参考方案2】:
UseCookieAuthentication 现在是deprecated。我设法使用
对其进行配置services.Configure<SecurityStampValidatorOptions>(o =>
o.ValidationInterval = TimeSpan.FromSeconds(10));
根据request从回复转移到回答。
【讨论】:
如果我使用的是 ASP.NET(不是 Core),这是否有效?我很迷惑。如果我去Asp Identity Repo,它说它是针对 Asp.NET Core 的。【参考方案3】:我观察到令牌验证需要 SecurityStamp。
回购: 在数据库中将 SecurityStamp 设置为 null 生成令牌(工作正常) 验证令牌(失败)
【讨论】:
这一定是个错误。生成无法验证的令牌是没有意义的。 该错误是它允许您在安全标记为空白时生成令牌。 (恕我直言,如果没有安全标记,GenerateEmailConfirmationToken 应该会失败。请参阅此答案:***.com/a/29926407/1058214)以上是关于什么是 ASP.NET Identity 的 IUserSecurityStampStore<TUser> 接口?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Identity 出现“创建模型时无法使用上下文”异常
ASP.NET Identity教程ASP.NET Identity入门
ASP.NET Identity 3.0 上的 IIdentityMessageService 等价物是啥?