如何在AspNetCore.Identity中的IdentityErrorDescriber中添加新方法

问题描述 投票:0回答:1

对于身份,我在项目中使用 AspNetCore.Identity 包。
我将自定义注册端点。请求正文应为电话号码和密码。
在这种情况下,它可能会返回一些与电话号码相关的错误消息。
例如,电话号码 xxx 无效、电话号码 xxx 重复、...
所以我将通过自定义 IdentityErrorDescriber 添加一些错误描述器。

public class AuthErrorDescriber : IdentityErrorDescriber
{
    /// <summary>
    /// Returns an <see cref="IdentityError"/> indicating the specified <paramref name="phoneNumber"/> is invalid.
    /// </summary>
    /// <param name="phoneNumber">The phoneNumber that is invalid.</param>
    /// <returns>An <see cref="IdentityError"/> indicating the specified <paramref name="phoneNumber"/> is invalid.</returns>
    public virtual IdentityError InvalidPhoneNumber(string? phoneNumber)
    {
        return new IdentityError
        {
            Code = nameof(InvalidPhoneNumber),
            // Here, I cannot customize or use `Resources`
            // for example `Resources.PasswordMismatch`
            Description = $"PhoneNumber '{phoneNumber}' is invalid."
        };
    }
}

我添加了这样的错误描述。

services.AddIdentity<User, Role>()
    .AddErrorDescriber<AuthErrorDescriber>();

但是我不能在我的代码中使用这个新方法

if (string.IsNullOrEmpty(phoneNumber) || !PhoneNumberHelper.IsValid(phoneNumber))
{
    return CreateValidationProblem(IdentityResult.Failed(userManager.ErrorDescriber.InvalidPhoneNumber(phoneNumber)));
}

这是错误消息。

CS1061: 'IdentityErrorDescriber' does not contain a definition for 'InvalidPhoneNumber' and no accessible extension method 'InvalidPhoneNumber' accepting a first argument of type 'IdentityErrorDescriber' could be found (are you missing a using directive or an assembly reference?)

如何解决以上问题?
还有其他方法可以在那里添加新方法吗?

c# asp.net-core inheritance asp.net-identity
1个回答
0
投票

显示此错误的原因很明显,您创建的自定义 AuthErrorDescriber 已在身份服务中正确注册,但是当您尝试使用 userManager.ErrorDescriber 访问自定义方法 (InvalidPhoneNumber) 时,它会被视为基本 IdentityErrorDescriber 类型您派生的 AuthErrorDescriber 类型。

要解决此错误,我建议您可以尝试以下代码:

        var errorDescriber = userManager.ErrorDescriber as AuthErrorDescriber;
        if (errorDescriber!=null)
        {
            var result = IdentityResult.Failed(errorDescriber.InvalidPhoneNumber("phoneNumber"));

        }

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.