首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将现有用户从MVC4 SimpleMembership迁移到MVC5 ASP.NET标识

将现有用户从MVC4 SimpleMembership迁移到MVC5 ASP.NET标识
EN

Stack Overflow用户
提问于 2013-10-31 00:40:57
回答 2查看 3.6K关注 0票数 18

我有一个当前实现SimpleMembership.的MVC4站点在网站的下一次迭代中,我想升级到MVC5和ASP.NET Identity。两个站点在web.config中具有相同的机器密钥。SimpleMembership表有一列PasswordPaswordSalt,ASP.NET身份表有一列PasswordHash,似乎是Password + PasswordSalt的组合。

我尝试将旧站点上的密码PasswordSlat连接在一起,但不起作用。

我的问题是,

如何将现有用户的密码从旧站点迁移到新站点?

EN

回答 2

Stack Overflow用户

发布于 2015-07-06 04:01:47

根据http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity的说法:

应用程序用户的密码被加密并存储在数据库中。SQL成员身份中使用的加密算法与新身份系统中使用的加密算法不同。要重用旧密码,我们需要在旧用户使用SQL成员关系算法登录时选择性地解密密码,同时在新用户的身份中使用加密算法。

UserManager类具有属性'PasswordHasher‘,该属性存储实现'IPasswordHasher’接口的类的实例。这用于在用户身份验证事务期间加密/解密密码。在步骤3中定义的UserManager类中,创建一个新类SQLPasswordHasher并复制以下代码。

所以你必须用下面的代码创建一个新的hasher类:

代码语言:javascript
复制
public class SQLPasswordHasher : PasswordHasher
  {
    public override string HashPassword(string password)
    {
        return base.HashPassword(password);
    }

public override PasswordVerificationResult VerifyHashedPassword(string  hashedPassword, string providedPassword)
    {
        string[] passwordProperties = hashedPassword.Split('|');
        if (passwordProperties.Length != 3)
        {
            return base.VerifyHashedPassword(hashedPassword, providedPassword);
        }
        else
        {
            string passwordHash = passwordProperties[0];
            int passwordformat = 1;
            string salt = passwordProperties[2];
            if (String.Equals(EncryptPassword(providedPassword, passwordformat, salt), passwordHash, StringComparison.CurrentCultureIgnoreCase))
            {
                return PasswordVerificationResult.SuccessRehashNeeded;
            }
            else
            {
                return PasswordVerificationResult.Failed;
            }
        }
    }

//This is copied from the existing SQL providers and is provided only for back-compat.
    private string EncryptPassword(string pass, int passwordFormat, string salt)
    {
        if (passwordFormat == 0) // MembershipPasswordFormat.Clear
            return pass;

        byte[] bIn = Encoding.Unicode.GetBytes(pass);
        byte[] bSalt = Convert.FromBase64String(salt);
        byte[] bRet = null;

        if (passwordFormat == 1)
        { // MembershipPasswordFormat.Hashed 
            HashAlgorithm hm = HashAlgorithm.Create("SHA1");
            if (hm is KeyedHashAlgorithm)
            {
                KeyedHashAlgorithm kha = (KeyedHashAlgorithm)hm;
                if (kha.Key.Length == bSalt.Length)
                {
                    kha.Key = bSalt;
                }
                else if (kha.Key.Length < bSalt.Length)
                {
                    byte[] bKey = new byte[kha.Key.Length];
                    Buffer.BlockCopy(bSalt, 0, bKey, 0, bKey.Length);
                    kha.Key = bKey;
                }
                else
                {
                    byte[] bKey = new byte[kha.Key.Length];
                    for (int iter = 0; iter < bKey.Length; )
                    {
                        int len = Math.Min(bSalt.Length, bKey.Length - iter);
                        Buffer.BlockCopy(bSalt, 0, bKey, iter, len);
                        iter += len;
                    }
                    kha.Key = bKey;
                }
                bRet = kha.ComputeHash(bIn);
            }
            else
            {
                byte[] bAll = new byte[bSalt.Length + bIn.Length];
                Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
                Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
                bRet = hm.ComputeHash(bAll);
            }
        }

        return Convert.ToBase64String(bRet);
    }

然后在您的Identity UserManager类中声明一个构造器以使用此散列器,例如:

代码语言:javascript
复制
public UserManager()
        : base(new UserStore<User>(new ApplicationDbContext()))
    {
        this.PasswordHasher = new SQLPasswordHasher();
}
票数 1
EN

Stack Overflow用户

发布于 2015-09-22 22:56:34

下面的链接说明了这一点:http://kevin-junghans.blogspot.com/2014/02/migrating-existing-website-from.html

代码语言:javascript
复制
  public class SimplePasswordHasher : IPasswordHasher
  {
     public string HashPassword(string password)
     {
        return Crypto.HashPassword(password);
     }
     public PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
     {
        if(Crypto.VerifyHashedPassword(hashedPassword, providedPassword))
        return PasswordVerificationResult.Success;
        else return PasswordVerificationResult.Failed;
      }  
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19688804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档