我需要在asp.net MVC 5中实现的应用程序中使用Asp.Net Identity 2构建自定义用户密码检查。
我在stackoverflow帖子(Writing a custom IUserPasswordStore and SignInManager.PasswordSignInAsync in Identity 2.1)中读到了我只需要覆盖UserManager中的CheckPasswordAsync方法。
我尝试在IdentityConfig.cs文件中覆盖此方法。以下是我添加到ApplicationUserManager类的代码,仅用于测试此解决方案:
public override async Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
return await Task.Run(() => {
return true;
});
}
问题是此代码永远不会在登录过程中运行,并且登录始终失败。要登录用户我正在使用SignInManager.PasswordSignInAsync登录用户,这是在asp.net MVC 5中创建新的Web应用程序时的默认设置。此方法不应该调用ApplicationUserManager。 CheckPasswordAsync?或者这项工作还需要另一种配置吗?
答案 0 :(得分:8)
它应该工作。我刚刚使用了标准的ASP.NET MVC模板,通过NuGet更新了所有涉及的库,它必须有效。
我猜问题就是你重写方法的方式。
在ApplicationUserManager
尝试更改代码:
public override Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
return Task.FromResult<bool>(true);
}
或:
public override Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
{
return Task.Run(() => MyCheckPasswordAsync());
}
private bool MyCheckPasswordAsync()
{
return true;
}
你会看到它通过:
答案 1 :(得分:4)
问题在于我尝试使用系统中不存在的用户登录。
SignInManager.PasswordSignInAsync从不调用ApplicationUserManager。如果用户不存在于用户存储库中,则为CheckPasswordAsync。
总之,我必须将用户存储在我的应用程序中或实现自定义用户存储机制。
答案 2 :(得分:0)
这可能不是一个直接的答案,但它提供了问题的完整解决方案。他实现了一个自定义授权过滤器,您可以自定义它以执行您想要的操作。
https://weblog.west-wind.com/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class BasicAuthenticationFilter : AuthorizationFilterAttribute
然后可以像这样使用它而不是[Authorize]属性
[MyBasicAuthenticationFilter]
public class QueueController : ApiController