【问题标题】:How to create SecurityStamp for AspNetUser in ASP .NET MVC 5如何在 ASP .NET MVC 5 中为 AspNetUser 创建 SecurityStamp
【发布时间】:2014-10-10 21:47:21
【问题描述】:

当我在应用程序运行时通过注册操作创建用户时,应用程序用户会获得 SecurityStamp。当我通过以下方式添加用户时:

if (!context.Users.Any()) {
                System.Diagnostics.Debug.WriteLine("INSIDE");
                var hasher = new PasswordHasher();
                try {
                    var users = new List<ApplicationUser> { 
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl"},
                        new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4445@wp.pl", UserName = "informatyka4445@wp.pl"}
                        };

                    users.ForEach(user => context.Users.AddOrUpdate(user));

                    context.SaveChanges();
                } catch (DbEntityValidationException e) {
                    System.Diagnostics.Debug.WriteLine("EXC: ");
                    foreach (DbEntityValidationResult result in e.EntityValidationErrors) {
                        foreach (DbValidationError error in result.ValidationErrors) {
                            System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
                        }
                    }

                }
            }

用户没有获得安全标记:

然后当我想登录时,我得到:

问题:如何为用户生成SecurityStamp

【问题讨论】:

标签: c# asp.net-mvc entity-framework asp.net-identity seed


【解决方案1】:

安全印章可以是您想要的任何东西。它经常被误认为是时间戳,但事实并非如此。如果用户实体发生更改,它将被 ASP.NET Identity 覆盖。如果您正在直接处理上下文,最好的方法是生成一个新的 Guid 并将其用作标记。这是一个简单的例子:

var users = new List<ApplicationUser> 
                { 
                    new ApplicationUser
                        {
                            PasswordHash = hasher.HashPassword("TestPass44!"), 
                            Email = "informatyka4444@wp.pl", 
                            UserName = "informatyka4444@wp.pl", 
                            SecurityStamp = Guid.NewGuid().ToString()
                        },
                    new ApplicationUser
                        {
                            PasswordHash = hasher.HashPassword("TestPass44!"),
                            Email = "informatyka4445@wp.pl", 
                            UserName = "informatyka4445@wp.pl", 
                            SecurityStamp = Guid.NewGuid().ToString()
                         }
                };

【讨论】:

  • 它起作用了你知道为什么我没有这个 SequirtyStamp 集就无法登录吗?
  • @Yoda 我前段时间遇到了同样的问题,但我只能猜测。我认为该属性将在登录过程中由框架检查,以确保您的数据库没有损坏(或类似的东西)。根据这个post,它用于使cookies无效。
  • 安全标记用于使用户登录 cookie 无效并强制他们重新登录。 stackoverflow.com/a/19505060/749626
  • 如果为空,您的密码重置可能无效 - “无效令牌”。错误
【解决方案2】:

如果我们查看IdentityUserAspNetUsers 数据内部,我们会发现SecurityStamp 与普通GUID 具有不同的形式:

这是因为 GUID 被转换为 HEX 映射字符串。

我们可以创建一个函数来生成新的安全标记,它将生成一个新的GUID 并将其转换为 HEX 映射字符串:

Func<string> GenerateSecurityStamp = delegate()
{
    var guid = Guid.NewGuid();
    return String.Concat(Array.ConvertAll(guid.ToByteArray(), b => b.ToString("X2")));
};

你可以检查它运行到这个.NET Fiddle

所以,如果我们想为身份用户播种,我们可以使用它来生成SecurityStamp

modelBuilder.Entity<IdentityUser>().HasData(new ApplicationUser
{
    ...

    // Security stamp is a GUID bytes to HEX string
    SecurityStamp = GenerateSecurityStamp(),
});

警告:要非常小心,不要使用上面的示例进行播种,因为它会在我们每次创建新迁移时更改数据。使用HasData 时应始终预先生成种子数据,而不是动态内联生成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2021-04-30
    • 1970-01-01
    • 2017-05-27
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多