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


176

查看ASP.NET标识(​​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属性。

经过进一步的挖掘后,看起来a SecurityStamp是一个GuidUserManager(例如,更改密码)的关键点上新生成的a 。

由于我正在Reflector中检查此代码,因此我无法真正理解更多内容。几乎所有符号和异步信息都已优化。

另外,Google并没有太大帮助。

问题是:

  • 什么是SecurityStampASP.NET身份标识?它的作用是什么?
  • SecurityStamp创建身份验证Cookie时是否发挥作用?
  • 是否需要采取任何安全措施或预防措施?例如,不将此值向下游发送给客户吗?

更新(9/16/2014)

此处提供源代码:


1
@TryingToImprove,新的身份存储和相关的OWIN中间件设计为高度可定制的。像SimpleMembership一样,有一个现成的实现,可以利用SQL Express上的最新EF。但是,可以根据特定的对象自定义模式,数据查询方法,数据库源,甚至中间件。而且,MS发布的实现本身仍在不断发展。这就是每个人都难以找到特定定义的原因。
Dave Alperovich 2014年

Answers:


223

这是为了表示您的用户凭据的当前快照。因此,如果没有任何变化,戳记将保持不变。但是,如果更改了用户密码或删除了登录名(取消了您的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
如果我要从MVC4表结构中迁移数据怎么办?我可以将该字段留空吗?还是将事情搞砸了?
Dmytro Shevchenko 2013年

1
您可以让它返回ID或常量以有效地使其成为无操作。Null /“”也可能会起作用。
郝公

2
UserManager.UpdateSecurityStampAsync(userId)是否可用于UseOAuthBearerTokens?
里卡德2014年

7
否,OAuthBearerTokens当前不受影响。
郝宫

3
UseCookieAuthentication过时的了。我设法使用进行了配置services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));
riezebosch

10

现在不推荐使用 UseCookieAuthentication 。我设法使用配置

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

根据请求从答复移到答复。


3
如果我使用的是ASP.NET(不是Core),这行得通吗?我很困惑。如果我去Asp Identity Repo,它说它是针对Asp.NET Core的。
El Mac

5

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

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


那一定是个错误。生成无法验证的令牌没有任何意义。
威廉·T·马拉德

这样做的错误是,当安全标记为空白时,您可以生成令牌。(如果没有安全戳记,imho GenerateEmailConfirmationToken应该会失败。请参见以下答案:stackoverflow.com/a/29926407/1058214
mendel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.