什么是 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&lt;TUser&gt; 实现,它本质上是获取和设置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&lt;SecurityStampValidatorOptions&gt;(o =&gt; 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 等价物是啥?

ASP.NET Identity系列教程运用ASP.NET Identity

ASP.net如何得到SCOPE_IDENTITY()?

ASP.NET Core Identity 系列之七