如何更改剃须刀页面中注册页面的身份错误

Posted

技术标签:

【中文标题】如何更改剃须刀页面中注册页面的身份错误【英文标题】:How to change Identity error for register page in razor pages 【发布时间】:2021-06-28 15:52:24 【问题描述】:

我有一个基本问题。我想自定义IdentityResult 添加到ModelState 的错误。 这是我的代码(else 中的foreach 添加错误):

var user = new IdentityUser UserName = Input.Phone, PhoneNumber = Input.Phone;    
var result = await _userManager.CreateAsync(user, Input.Password);
                if (result.Succeeded)
                
                    //Do something...
                
                else
                
                    foreach (var error in result.Errors)
                    
                        //how can I change error.Description?
                        ModelState.AddModelError(string.Empty, error.Description);
                    
                

【问题讨论】:

【参考方案1】:

您可以覆盖IdentityErrorDescriber 的方法来更改身份错误消息。

public class YourIdentityErrorDescriber : IdentityErrorDescriber

    public override IdentityError DuplicateUserName(string username)
    
        return new IdentityError
        
            Code = nameof(DuplicateUserName),
            Description = "This is a error"
        ;
       //other method in IdentityErrorDescriber,you can see below
    

然后你就可以在startup(.AddErrorDescriber<YourIdentityErrorDescriber>();)注册了。

services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
            .AddEntityFrameworkStores<ApplicationDbContext>().AddErrorDescriber<YourIdentityErrorDescriber>();

关于IdentityErrorDescriber中的方法。

public class CustomIdentityErrorDescriber : IdentityErrorDescriber

    public override IdentityError DefaultError()  return new IdentityError  Code = nameof(DefaultError), Description = $"An unknown failure has occurred." ; 
    public override IdentityError ConcurrencyFailure()  return new IdentityError  Code = nameof(ConcurrencyFailure), Description = "Optimistic concurrency failure, object has been modified." ; 
    public override IdentityError PasswordMismatch()  return new IdentityError  Code = nameof(PasswordMismatch), Description = "Incorrect password." ; 
    public override IdentityError InvalidToken()  return new IdentityError  Code = nameof(InvalidToken), Description = "Invalid token." ; 
    public override IdentityError LoginAlreadyAssociated()  return new IdentityError  Code = nameof(LoginAlreadyAssociated), Description = "A user with this login already exists." ; 
    public override IdentityError InvalidUserName(string userName)  return new IdentityError  Code = nameof(InvalidUserName), Description = $"User name 'userName' is invalid, can only contain letters or digits." ; 
    public override IdentityError InvalidEmail(string email)  return new IdentityError  Code = nameof(InvalidEmail), Description = $"Email 'email' is invalid."  ; 
    public override IdentityError DuplicateUserName(string userName)  return new IdentityError  Code = nameof(DuplicateUserName), Description = $"User Name 'userName' is already taken."  ; 
    public override IdentityError DuplicateEmail(string email)  return new IdentityError  Code = nameof(DuplicateEmail), Description = $"Email 'email' is already taken."  ; 
    public override IdentityError InvalidRoleName(string role)  return new IdentityError  Code = nameof(InvalidRoleName), Description = $"Role name 'role' is invalid."  ; 
    public override IdentityError DuplicateRoleName(string role)  return new IdentityError  Code = nameof(DuplicateRoleName), Description = $"Role name 'role' is already taken."  ; 
    public override IdentityError UserAlreadyHasPassword()  return new IdentityError  Code = nameof(UserAlreadyHasPassword), Description = "User already has a password set." ; 
    public override IdentityError UserLockoutNotEnabled()  return new IdentityError  Code = nameof(UserLockoutNotEnabled), Description = "Lockout is not enabled for this user." ; 
    public override IdentityError UserAlreadyInRole(string role)  return new IdentityError  Code = nameof(UserAlreadyInRole), Description = $"User already in role 'role'."  ; 
    public override IdentityError UserNotInRole(string role)  return new IdentityError  Code = nameof(UserNotInRole), Description = $"User is not in role 'role'."  ; 
    public override IdentityError PasswordTooShort(int length)  return new IdentityError  Code = nameof(PasswordTooShort), Description = $"Passwords must be at least length characters."  ; 
    public override IdentityError PasswordRequiresNonAlphanumeric()  return new IdentityError  Code = nameof(PasswordRequiresNonAlphanumeric), Description = "Passwords must have at least one non alphanumeric character." ; 
    public override IdentityError PasswordRequiresDigit()  return new IdentityError  Code = nameof(PasswordRequiresDigit), Description = "Passwords must have at least one digit ('0'-'9')." ; 
    public override IdentityError PasswordRequiresLower()  return new IdentityError  Code = nameof(PasswordRequiresLower), Description = "Passwords must have at least one lowercase ('a'-'z')." ; 
    public override IdentityError PasswordRequiresUpper()  return new IdentityError  Code = nameof(PasswordRequiresUpper), Description = "Passwords must have at least one uppercase ('A'-'Z')." ; 

测试结果:

请参阅此answer。

【讨论】:

以上是关于如何更改剃须刀页面中注册页面的身份错误的主要内容,如果未能解决你的问题,请参考以下文章

Django中用于创建注册页面的“没有这样的表”错误是啥?

微信小程序之旅一(注册页面的使用)

身份剃须刀页面中的 Blazor 组件

帝国CMS导航栏目修改后个人空间和注册页面的显示不对称

MVC系列-6.注册页面

怎么在一个页面上实现先打开一个注册页,注册完后再跳转到原页面?