在Asp.Net Identity 2中构建自定义用户检查密码

4

我需要在使用Asp.Net Identity 2实现的asp.net MVC 5应用程序中构建自定义用户密码检查。

我在stackoverflow上阅读了一篇文章(编写Identity 2.1中的自定义IUserPasswordStore和SignInManager.PasswordSignInAsync),它说我只需要覆盖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吗?或者还需要其他配置才能使其工作?

你是否正在遵循ASP.NET Identity简介指南来触发身份验证过程?如果没有,你是如何实现的?你需要在问题中解释清楚。 - Albireo
我真的没有遵循任何配置过程。我只是创建了一个空的Web应用程序,尝试更改检查密码的过程。我会按照您的建议去尝试,看看我的自定义检查密码是否有效。 - miguelbgouveia
@Albireo 我读了《介绍ASP.NET身份验证》指南,我知道我可以更改Login控制器以使用我的自定义用户检查密码方法。但是我的问题仍然存在。如果我覆盖ApplicationUserManager.CheckPasswordAsync,那么当我调用SignInManager.PasswordSignInAsync方法时,它不应该被调用吗? - miguelbgouveia
1
我的问题只是为了尝试缩小你的情况范围:可能是其他某个地方缺少或错误(如 LeftyX 所说 ,它应该能正常工作),但不看整个代码很难确定。 - Albireo
你是在用户明确访问页面时手动调用方法,还是使用OWIN处理未经身份验证的用户访问Authorize的操作? - Albireo
我已经找到了问题@Albireo。我试图使用不存在的用户登录。似乎如果用户不存在于用户存储库中,SignInManager.PasswordSignInAsync从不调用ApplicationUserManager.CheckPasswordAsync。 - miguelbgouveia
3个回答

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;
}

在此之后,您将看到它经过了这个过程:

enter image description here


你使用的在线模板是什么?我只找到了一个名为ASP.NET_MVC5_Bootstrap3_3_1_LESS的模板,但生成的代码似乎不完全符合你所使用的。在这个例子中,在控制器登录中,它使用了UserManager.FindAsyncn方法而不是SignInManager.PasswordSignInAsync方法。 - miguelbgouveia
抱歉,我更正了我的答案。我是指使用标准的Asp.Net MVC模板。从Visual Studio 2013 - 新建项目Web - ASP.NET Web应用程序 - MVC; 身份验证 = 单个用户帐户。 - LeftyX
关于.NET 6的示例,请查看此链接:https://stackoverflow.com/a/74707470/8644294 - Ash K

5

问题在于我试图使用系统中不存在的用户登录。

如果用户存储库中不存在用户,SignInManager.PasswordSignInAsync 将不会调用 ApplicationUserManager.CheckPasswordAsync。

总之,我必须将用户存储在我的应用程序中或实现自定义用户存储机制。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接