我是一个网站,我正在使用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',哈希值是固定且可识别的,因为这算法没有使用盐。
但是,我无法以这些用户身份登录。如果我在新的哈希中设置断点,它永远不会得到它。在尝试登录时,我似乎都无法在帐户控制器的任何位置点击断点。
提前致谢
答案 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();
我终于可以登录了。