c# - 使用中的错误案例列表 _userManager.CreateAsync(user, password)

标签 c# asp.net asp.net-mvc asp.net-core

UserManager.CreateAsync Method (TUser, String)没有提到错误。

在 Controller 中,我只是编辑如下内容:

public async Task<ObjectResult> Register(RegisterViewModel model, string returnUrl = null)
{
    IDictionary<string, object> value = new Dictionary<string, object>();
    value["Success"] = false;
    value["ReturnUrl"] = returnUrl;

    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { Id = Guid.NewGuid().ToString(), UserName = model.Email, Email = model.Email };

        var result = await _userManager.CreateAsync(user, model.Password);

        if (result.Succeeded)
        {
            await _signInManager.SignInAsync(user, isPersistent: false);
            value["Success"] = true;
        }
        else
        {
            value["ErrorMessage"] = result.Errors;
        }    
    }

    return new ObjectResult(value);
}

在客户端:

$scope.registerForm_submit = function ($event, account) {
    $event.preventDefault();

    if (registerForm.isValid(account)) {

        // registerForm.collectData returns new FormData() which contains
        // email, password, confirmpassword, agreement, returnurl...

        let formData = registerForm.collectData(account),                
            xhttp = new XMLHttpRequest();

        xhttp.onreadystatechange = function () {
            if (xhttp.readyState === XMLHttpRequest.DONE) {
                let data = JSON.parse(xhttp.responseText);

                if (data['Success']) {
                    window.location = '/'
                } else {                        
                    if (data['ErrorMessage'][0]['code'] === 'DuplicateUserName') {
                        let li = angular.element('<li/>').text(`Email ${account['email']} already exists.`);
                        angular.element('div[data-valmsg-summary=true] ul').html(li);
                    }
                }
            }
        }

        xhttp.open('POST', '/account/register');
        xhttp.send(formData);
    }
};

我已尝试使用现有电子邮件注册新帐户并获得代码:

data['ErrorMessage'][0]['code'] === 'DuplicateUserName'

我的问题:如何检查其他情况?

最佳答案

在 ASP.NET Identity 中定义的错误代码位于 https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/Resources.Designer.cs - 我已将它们提取到此列表中:

  • 默认错误
  • 重复邮件
  • 重复姓名
  • 存在外部登录
  • 无效的邮箱
  • 无效 token
  • 无效的用户名
  • LockoutNotEnabled
  • NoTokenProvider
  • NoTwoFactorProvider
  • 密码不匹配
  • 密码需要数字
  • 密码要求较低
  • 密码需要非字母或数字
  • 密码要求上限
  • 密码太短
  • 属性太短
  • 未找到角色
  • StoreNotIQueryableRoleStore
  • StoreNotIQueryableUserStore
  • StoreNotIUserClaimStore
  • StoreNotIUserConfirmationStore
  • StoreNotIUserEmailStore
  • StoreNotIUserLockoutStore
  • StoreNotIUserLoginStore
  • StoreNotIUserPasswordStore
  • StoreNotIUserPhoneNumberStore
  • StoreNotIUserRoleStore
  • StoreNotIUserSecurityStampStore
  • StoreNotIUserTwoFactorStore
  • 用户已有密码
  • UserAlreadyInRole
  • 未找到用户名
  • 找不到用户名
  • UserNotInRole

ASP.NET Core Identity 定义了这些代码:

  • 默认错误
  • 并发失败
  • 密码不匹配
  • 无效 token
  • LoginAlreadyAssociated
  • 无效的用户名
  • 无效的邮箱
  • 重复用户名
  • 重复邮件
  • 无效角色名
  • DuplicateRoleName
  • 用户已有密码
  • UserLockoutNotEnabled
  • UserAlreadyInRole
  • UserNotInRole
  • 密码太短
  • 密码需要非字母数字
  • 密码需要数字
  • 密码要求较低
  • 密码要求上限

因此,可能并非所有以前的错误代码都会实际显示在 IdentityResult 中。我也不使用,所以这只是我从浏览可用源代码中收集的内容。买者自负...

似乎这应该记录在某处......

我喜欢在一个地方定义这种性质的字符串,所以我通常会这样做:

public class IdentityErrorCodes
{
    public const string DefaultError                    = "DefaultError";
    public const string ConcurrencyFailure              = "ConcurrencyFailure";
    public const string PasswordMismatch                = "PasswordMismatch";
    public const string InvalidToken                    = "InvalidToken";
    public const string LoginAlreadyAssociated          = "LoginAlreadyAssociated";
    public const string InvalidUserName                 = "InvalidUserName";
    public const string InvalidEmail                    = "InvalidEmail";
    public const string DuplicateUserName               = "DuplicateUserName";
    public const string DuplicateEmail                  = "DuplicateEmail";
    public const string InvalidRoleName                 = "InvalidRoleName";
    public const string DuplicateRoleName               = "DuplicateRoleName";
    public const string UserAlreadyHasPassword          = "UserAlreadyHasPassword";
    public const string UserLockoutNotEnabled           = "UserLockoutNotEnabled";
    public const string UserAlreadyInRole               = "UserAlreadyInRole";
    public const string UserNotInRole                   = "UserNotInRole";
    public const string PasswordTooShort                = "PasswordTooShort";
    public const string PasswordRequiresNonAlphanumeric = "PasswordRequiresNonAlphanumeric";
    public const string PasswordRequiresDigit           = "PasswordRequiresDigit";
    public const string PasswordRequiresLower           = "PasswordRequiresLower";
    public const string PasswordRequiresUpper           = "PasswordRequiresUpper";

    public static string[] All = { 
        DefaultError,
        ConcurrencyFailure,
        PasswordMismatch,
        InvalidToken,
        LoginAlreadyAssociated,
        InvalidUserName,
        InvalidEmail,
        DuplicateUserName,
        DuplicateEmail,
        InvalidRoleName,
        DuplicateRoleName,
        UserAlreadyHasPassword,
        UserLockoutNotEnabled,
        UserAlreadyInRole,
        UserNotInRole,
        PasswordTooShort,
        PasswordRequiresNonAlphanumeric,
        PasswordRequiresDigit,
        PasswordRequiresLower,
        PasswordRequiresUpper 
    };
}

这让您可以在用作查找的键中保持一致,最后一个字段 All 为您提供一个数组,您可以在必要时枚举。

使用您的代码,您可以这样做:

if(data['ErrorMessage'][0]['code'] == IdentityErrorCodes.DuplicateUserName)
{
}

等等。

关于c# - 使用中的错误案例列表 _userManager.CreateAsync(user, password),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583707/

相关文章:

asp.net-mvc - MVC 3 RC 上的全局过滤器注册错误

C# - LinkedList - 如何删除指定节点之后的所有节点?

javascript - 可调整大小的母版页和内容占位符

c# - 将列表与其他多个列表进行比较

asp.net - IIS,拒绝访问静态文件;这个例子有什么问题吗?

c# - 如何使用 ASP.NET MVC 伪造或模拟用户登录(身份验证)以进行功能测试

css - MVC5 Vanilla 布局未显示

c# - Windows 窗体文本在离开事件时更改

c# - 为什么不能将 null 分配给 C# 中的对象?

c# - 如何在 Javascript 中以编程方式打开 IE9 兼容性 View