为了账号安全,请及时绑定邮箱和手机立即绑定

.net core Identity,获取特定的注册错误条件

.net core Identity,获取特定的注册错误条件

C#
慕神8447489 2021-11-14 10:57:18
我希望测试/处理从 UserManager 返回的特定错误条件,例如:由于用户名已存档,注册失败等var user = new SiteUser() { UserName = username, Email = RegisterViewModel.Email };var result = await _userManager.CreateAsync(user, RegisterViewModel.Password);if (!result.Succeeded){    // here I want to test for specific error conditions    // eg: username already on file, etc    // how can I do this?}
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

IdentityResult包含一个Errors属性,它的类型是IEnumerable<IdentityError>。IdentityError本身包含一个Code属性和一个Description属性。这意味着result您的 OP 中的变量具有Errors描述发生的特定错误的属性。


IdentityErrorDescriber用于生成 的实例IdentityError。这是来自源的示例:


public virtual IdentityError DuplicateUserName(string userName)

{

    return new IdentityError

    {

        Code = nameof(DuplicateUserName),

        Description = Resources.FormatDuplicateUserName(userName)

    };

}

IdentityErrorDescriber以同样的方式注入 DI 系统UserManager。这意味着您可以将它作为控制器_errorDescriber构造函数中的依赖项(例如)并在以后使用它,就像这样(假设已在您的构造函数中创建和设置):


if (!result.Succeeded)

{

    // DuplicateUserName(...) requires the UserName itself so it can add it in the

    // Description. We don't care about that so just provide null.

    var duplicateUserNameCode = _errorDescriber.DuplicateUserName(null).Code;


    // Here's another option that's less flexible but removes the need for _errorDescriber.

    // var duplicateUserNameCode = nameof(IdentityErrorDescriber.DuplicateUserName); 


    if (result.Errors.Any(x => x.Code == duplicateUserNameCode))

    {

        // Your code for handling DuplicateUserName.

    }

}

有许多不同的方法可以获取Code您想要测试的值并自行进行检查 - 这只是一个示例,它对于您可能想要对代码和错误本身进行的自定义是相当安全的。


如果您有兴趣,这里有一个指向DuplicateUserName错误添加到IdentityResult您返回的源的链接。


我只在DuplicateUserName这里讨论过,但还有其他IdentityErrorDescriber值,例如InvalidEmail您可能还想检查。


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信