aspnet身份;如何使用旧密码登录?

时间:2015-05-26 08:45:59

标签: asp.net-web-api asp.net-identity-2

我是一个网站,我正在使用aspnet identity 2.0更新到web api。

它是我们需要允许用户使用旧密码的旧网站;至少在合理的迁移期间

article之后,我从基础UserManager派生了一个新的UserManager,并设置了PasswordHasher以使用旧的SHA1算法进行散列。

我的密码哈希看起来像这样:

public class SQLPasswordHasher : PasswordHasher
{
    public override string HashPassword(string password)
    {
        string cipherText = EncryptPassword(password);
        return cipherText;
    }

    public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
    {
        string cipherText = EncryptPassword(providedPassword);

        if (cipherText == hashedPassword)
        {
            return PasswordVerificationResult.SuccessRehashNeeded;
        }
        else
        {
            return PasswordVerificationResult.Failed;
        }
    }

    private string EncryptPassword(string plainText)
    {
        return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(plainText, "sha1");
    }
}

当我使用此代码注册用户时,我可以看到密码正在哈希并正确保存在数据库中...对于密码' foobar',哈希值是固定且可识别的,因为这算法没有使用盐。

但是,我无法以这些用户身份登录。如果我在新的哈希中设置断点,它永远不会得到它。在尝试登录时,我似乎都无法在帐户控制器的任何位置点击断点。

提前致谢

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题,希望其他人可以受益。

问题是,我无法找到登录时调用web api服务的内容。我终于意识到,正在设置一个名为/ Token的东西作为在app.js javascript中调用的url。

通过项目服务器端搜索和谷歌搜索引导我到this article,它指向我在模板应用程序的'Providers'文件夹中的ApplicationOAuthProvider.cs文件。

感兴趣的特定行是GrantResourceOwnerCredentials方法实例化它自己的用户管理器的地方,因此:

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

从那里,我所要做的就是添加这一行:

    userManager.PasswordHasher = new SQLPasswordHasher();

我终于可以登录了。