【问题标题】:Creating users with no password using ASP.NET Identity使用 ASP.NET 标识创建没有密码的用户
【发布时间】:2016-02-22 03:43:45
【问题描述】:

我被要求提供通过 UI 无密码创建用户的能力。我正在尝试使用 ASP.NET Identity 来完成此任务。

我可以使用UserManagerCreate 方法成功地创建一个没有密码的用户:

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

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

使用 ASP.NET Identity,当凭据包含NULL 密码并且数据库中的用户包含NULL PasswordHash 时,如何配置我的代码以正确验证用户凭据?这样的事情甚至可能吗?

【问题讨论】:

  • 可能的重复和/或解决方案stackoverflow.com/questions/28110934/…
  • 我已经看过这个问题了。他要问的是我如何以 any 用户身份登录而无需提供密码。我要问的是如何以没有密码保存在数据库中的特定用户身份登录。
  • 明白。您是否尝试过他发布的代码? FindByNameAsync 和 SignInAsync?
  • 我当然可以使用该代码,但我必须提供一些逻辑来验证数据库中此特定用户的密码是否首先设置为 NULL,否则我将能够以任何用户身份登录而无需提供密码。而且我不想提供这种逻辑,因为 SignInManager 已经为我处理好了。

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


【解决方案1】:

是的,你可以。 ASP.NET 身份框架是完全可定制的。只需像这样覆盖 PasswordValidator.ValidateAsyncPasswordHasher.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();

【讨论】:

    【解决方案2】:

    好的,您需要做的是使用您的数据库上下文找到用户(AspNetUsers 用户)。拥有用户后,您可以检查他们的PasswordHash 是否为空。 如果是,那么只需使用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);
    }
    
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我不认为您可以在没有密码的情况下验证用户。作为一种解决方法:我建议不要使用空白密码,而是在创建用户和验证凭据时使用 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);
      

      【讨论】:

      • 如果有的话,您会创建一个加密随机密码并向用户发送密码重置电子邮件。但是不存在应该为所有用户使用相同的虚拟密码的情况。
      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      相关资源
      最近更新 更多