什么是ASP.NET Identity的IUserSecurityStampStore <TUser>接口?

看看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中的这段代码,所以除了这个之外,我无法真正解读。 几乎所有的符号和asynchronous信息都被优化了。

另外,谷歌并没有太多的帮助。

问题是:

  • 什么是ASP.NET标识中的SecurityStamp ,它的用途是什么?
  • SecurityStamp在创build身份validationCookie时扮演什么angular色?
  • 是否有任何安全后果或预防措施,需要采取与此? 例如,不要将此值下游发送给客户端?

更新(9/16/2014)

源代码在这里:

  • https://github.com/aspnet/Identity/
  • https://github.com/aspnet/Security/

这是为了表示用户凭据的当前快照。 所以如果没有任何变化,邮票将保持不变。 但是,如果用户的密码被改变了,或者login被删除(取消你的google / fb账户),邮票将会改变。 这是自动签署用户/拒绝旧的cookie发生这种情况时所需要的,这是2.0版本中的一项function。

身份还不是开源的,目前还在stream水线上。

编辑:更新为2.0.0。 所以SecurityStamp的主要目的是使每个地方都可以注销。 基本的想法是,只要用户的某个安全相关信息被修改,比如密码,最好自动将任何已经存在的cookie标识设为无效,因此如果您的密码/帐户之前已被破解,攻击者将无法再访问。

在2.0.0中,我们添加了以下configuration来挂接CookieMiddlewareOnValidateIdentity方法,以查看SecurityStamp并在发生更改时拒绝Cookie。 如果邮票不变,它也会自动刷新数据库中的每个refreshInterval的用户声明(其中包括更改angular色等)

 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); 

我观察到SecurityStamp是令牌validation所必需的。

要回购:在数据库中将SecurityStamp设置为null生成令牌(正常工作)validation令牌(失败)