什么是ASP.NET Identity&amp; IUserSecurityStampStore <tuser>接口?</tuser>

时间:2013-10-21 06:09:06

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

看看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属性。

经过多次挖掘后,似乎SecurityStampGuidUserManager的关键点新生成的({1}}。

由于我正在 Reflector 中检查此代码,因此我无法解释这个问题。几乎所有的符号和异步信息都已经过优化。

此外,谷歌没有太多帮助。

问题是:

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

更新(2014年9月16日)

此处提供的源代码:

3 个答案:

答案 0 :(得分:204)

这意味着代表用户凭据的当前快照。因此,如果没有任何变化,邮票将保持不变。但是,如果更改了用户的密码,或者删除了登录信息(取消链接您的google / fb帐户),邮票将会更改。在发生这种情况时,这需要自动签名用户/拒绝旧cookie,这是2.0版本中的一项功能。

身份还不是开源的,它目前还在筹备中。

修改:已针对2.0.0进行了更新。因此SecurityStamp的主要目的是在所有地方启用退出。基本的想法是,无论何时在用户上更改与安全相关的内容(如密码),最好自动使任何现有的cookie登录失效,因此如果您的密码/帐户先前已被盗用,则攻击者将无法再访问。

在2.0.0中,我们添加了以下配置来挂钩OnValidateIdentity中的CookieMiddleware方法以查看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);

答案 1 :(得分:3)

我发现令牌验证需要SecurityStamp。

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

答案 2 :(得分:3)

现在,UseCookieAuthentication为deprecated。我设法使用

配置它
services.Configure<SecurityStampValidatorOptions>(o => 
    o.ValidationInterval = TimeSpan.FromSeconds(10));

根据request的回复移至回答。