使用ASP.NET身份认证创建没有密码的用户

 2023-02-15    269  

问题描述

我已被要求提供通过UI创建用户的能力,没有密码.我正在尝试使用ASP.NET身份完成这一点.

我能够使用UserManager s Create方法成功创建一个没有密码的用户:

使用ASP.NET身份认证创建没有密码的用户

if (vm.ShouldHavePassword)
{
    userManager.Create(userToInsert, vm.Password);
}
else
{
    userManager.Create(userToInsert);
}

呼叫Create方法后,测试用户已成功保存到我们的AspNetUsers表中.当我不提供密码时,我们AspNetUsers表中的PasswordHash列设置为NULL.

我的问题是,我无法以没有密码的测试用户登录.以下是我们用于验证用户凭据的方法调用:

result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

我试图以多次具有NULL PasswordHash的测试用户登录.为此,我在登录表单中没有提供密码.结果,将NULL密码传递到PasswordSignInAsync方法中.此方法调用的返回值始终SignInStatus.Failure.

使用ASP.NET标识,如何配置我的代码,以便在凭据包含NULL密码时正确地验证用户凭据,而数据库中的用户包含NULL PasswordHash?这是可能的吗?

推荐答案

是的,您可以. ASP.NET Identity Framework是完全可定制的.只是覆盖PasswordValidator.ValidateAsync和PasswordHasher.VerifyHashedPassword方法,如下所示:

internal class CustomPasswordValidator: PasswordValidator
{
    public override async Task<IdentityResult> ValidateAsync(string item)
    {
        if (string.IsNullOrEmpty(item)) return IdentityResult.Success;
        return await base.ValidateAsync(item);
    }
}

internal class CustomPasswordHasher : PasswordHasher
{
    public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
    {
        if (hashedPassword == null && string.IsNullOrEmpty(providedPassword))
            return PasswordVerificationResult.Success;
        return base.VerifyHashedPassword(hashedPassword, providedPassword);
    }
}

并设置它们:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

    manager.PasswordValidator = new CustomPasswordValidator();
    manager.PasswordHasher = new CustomPasswordHasher();

其他推荐答案

好的,您需要做的是使用DB上下文找到用户(AspNetUsers用户).拥有用户后,可以检查它们的PasswordHash是否为null.
如果是,则只需使用SignInManager.SignIn签署它们.
如果没有,请使用SignInManager.PasswordSignIn.

示例..

//alternatively, you can find the user using Email, Id or some other unique field
var user = db.AspNetUsers.FirstOrDefault(p => p.UserName); 
if (user != null)
{
    if (user.PasswordHash == null)
        await SignInManager.SignInAsync(user, true, true);
    else
        await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: false);
}

其他推荐答案

我不认为您可以在没有密码的情况下验证用户.作为解决方法:而不是空白密码,我建议使用C#代码中的一些虚拟/公共密码,同时创建用户,同时验证凭据

创建用户时

if (vm.ShouldHavePassword)
{
    userManager.Create(userToInsert, vm.Password);
}
else
{
    userManager.Create(userToInsert, "someDummy123$");
}

验证时

result = await SignInManager.PasswordSignInAsync(model.UserName, "someDummy123$", model.RememberMe, shouldLockout: false);

以上所述是小编给大家介绍的使用ASP.NET身份认证创建没有密码的用户,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33760.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。