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

What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?

在查看ASP.NET标识(ASP.NET中的新成员实现)时,我在实现自己的UserStore时遇到了这个接口:

1
2
3
4
5
6
7
8
9
10
11
//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.SecurityStamp属性。

在进一步挖掘之后,似乎SecurityStamp是在UserManager的关键点(例如,更改密码)新生成的Guid

除了这一点,我真的无法解释太多,因为我在Reflector中检查这段代码。几乎所有的符号和异步信息都被优化了。

另外,谷歌也没什么帮助。

问题是:

  • ASP.NET标识中的SecurityStamp是什么,它用于什么?
  • 创建身份验证cookie时,SecurityStamp是否扮演任何角色?
  • 是否需要采取任何安全措施或预防措施?例如,不要将此值发送到下游客户机?

更新(9/16/2014)

此处提供的源代码:

  • https://github.com/aspnet/identity网站/
  • https://github.com/aspnet/安全/


这是为了表示用户凭据的当前快照。因此,如果没有任何变化,邮票将保持不变。但是,如果用户的密码被更改,或者登录被删除(取消你的google/fb帐户的链接),那么图章就会改变。这是需要的事情,如自动签署用户/拒绝旧的cookie时,发生这种情况,这是一个功能,在2.0。

标识还不是开源的,它目前仍在开发中。

编辑:更新为2.0.0。因此,SecurityStamp的主要目的是使所有地方都能注销。基本思想是,每当用户上的安全相关内容发生更改(如密码)时,最好自动使任何现有的登录cookie失效,因此,如果您的密码/帐户以前受到攻击,攻击者将不再具有访问权限。

在2.0.0中,我们添加了以下配置来钩住CookieMiddleware中的OnValidateIdentity方法,以查看SecurityStamp并在其更改时拒绝cookie。如果图章不变,它还会在每个refreshInterval中自动刷新用户在数据库中的声明(它负责更改角色等事项)。

1
2
3
4
5
6
7
8
9
10
11
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))
    }
});

如果应用程序想要显式触发此行为,它可以调用:

1
UserManager.UpdateSecurityStampAsync(userId);


现在不推荐使用useCookieAuthentication。我设法用

2

从答复移动到按请求答复。


我观察到令牌验证需要SecurityStamp。

回购:在databsae中将securitystamp设置为空生成令牌(工作正常)验证令牌(失败)