首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在.NET 6.0中定位身份错误消息

如何在.NET 6.0中定位身份错误消息
EN

Stack Overflow用户
提问于 2022-02-05 11:26:30
回答 1查看 244关注 0票数 2

我正在尝试本地化标准标识错误消息。我看过几次关于这个话题的讨论。我确实成功地创建了一个项目并使用了自己的翻译,但在翻译标准标识错误信息方面失败了。我决定创建一个新的项目来关注身份错误。构造函数MultilanguageIdentityErrorDescriber正在被调用并返回期望值。当我进入https://localhost:7067/Identity/Account/Register并将“测试”输入电子邮件字段标准错误“”时,将显示“电子邮件字段不是有效的电子邮件地址.”。当有人能引导我走向正确的方向或给我一些链接时,我很感激。几个小时后,我决定在这里问你们。谢谢!

Program.cs

代码语言:javascript
运行
复制
using Localizer.Data;
using Localizer.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddErrorDescriber<MultilanguageIdentityErrorDescriber>()    
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

MultilanguageIdentityErrorDescriber.cs

代码语言:javascript
运行
复制
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Localization;

public class MultilanguageIdentityErrorDescriber : IdentityErrorDescriber
{
    private readonly IStringLocalizer<SharedResource> _localizer;

    public MultilanguageIdentityErrorDescriber(IStringLocalizer<SharedResource> localizer)
    {        
        _localizer = localizer;
        // ckecking identityError.Description which returns expected value
        var identityError = new IdentityError();
        identityError = this.InvalidEmail("email@email.com");
        
    }

    public override IdentityError DuplicateEmail(string email)
    {
        return new IdentityError()
        {
            Code = nameof(DuplicateEmail),
            Description = string.Format(_localizer["Email {0} is already taken."], email)
        };
    }

    public override IdentityError DuplicateUserName(string userName)
    {

        return new IdentityError()
        {
            Code = nameof(DuplicateEmail),
            Description = string.Format(_localizer["Email {0} is already taken."], userName)
        };
    }

    public override IdentityError InvalidEmail(string email) 
    {
        return new IdentityError 
        { 
            Code = nameof(InvalidEmail), 
            Description = string.Format(_localizer["Email '{email}' is invalid."], email)
        }; 
    }

}
EN

回答 1

Stack Overflow用户

发布于 2022-11-25 04:22:29

我在我的项目中也有同样的问题,我也找不到翻译身份错误消息的方法,所以我做了一个看起来不太好看的解决方案,但它解决了我的问题,我用一个检查错误代码和设置自定义消息的方法创建了一个类,所以我不仅可以翻译,而且可以定义我自己的错误消息。我这么做是为了翻译成巴西葡萄牙语,这是代码:

代码语言:javascript
运行
复制
public class TranslateIdentityErrors 
{
    public string TranslateErrorMessage(string codeError)
    {
        string message = string.Empty;
        switch (codeError)
        {
            case "DefaultError":
                message =  "Um erro desconhecido ocorreu.";
                break;
            case "ConcurrencyFailure":
                message = "Falha de concorrência otimista, o objeto foi modificado.";
                break;
            case "InvalidToken":
                message = "Token inválido.";
                break;
            case "LoginAlreadyAssociated":
                message = "Já existe um usuário com este login.";
                break;
            case "InvalidUserName":
                message = $"Este login é inválido, um login deve conter apenas letras ou dígitos.";
                break;
            case "InvalidEmail":
                message = "E-mail inválido.";
                break;
            case "DuplicateUserName":
                message = "Este login já está sendo utilizado.";
                break;
            case "DuplicateEmail":
                message = $"Este email já está sendo utilizado.";
                break;
            case "InvalidRoleName":
                message = "Esta permissão é inválida.";
                break;
            case "DuplicateRoleName":
                message = "Esta permissão já está sendo Utilizada";
                break;                
            case "UserAlreadyInRole":
                message = "Usuário já possui esta permissão.";
                break;
            case "UserNotInRole":
                message = "Usuário não tem esta permissão.";
                break;
            case "UserLockoutNotEnabled":
                message = "Lockout não está habilitado para este usuário.";
                break;
            case "UserAlreadyHasPassword":
                message = "Usuário já possui uma senha definida.";
                break;
            case "PasswordMismatch":
                message = "Senha incorreta.";
                break;
            case "PasswordTooShort":
                message = "Senha muito curta.";
                break;
            case "PasswordRequiresNonAlphanumeric":
                message = "Senhas devem conter ao menos um caracter não alfanumérico.";
                break;
            case "PasswordRequiresDigit":
                message = "Senhas devem conter ao menos um digito ('0'-'9').";
                break;
            case "PasswordRequiresLower":
                message = "Senhas devem conter ao menos um caracter em caixa baixa ('a'-'z').";
                break;
            case "PasswordRequiresUpper":
                message = "Senhas devem conter ao menos um caracter em caixa alta ('A'-'Z').";
                break;
            default:
                message = "Um erro desconhecido ocorreu.";
                break;

        }
        return message;
    }
    
}

}

要使用此方法,我将转到将错误消息传递给modelstate的地方,并从下面更改代码:

代码语言:javascript
运行
复制
 var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
        if (!changePasswordResult.Succeeded)
        {
            foreach (var error in changePasswordResult.Errors)
            {                    
                ModelState.AddModelError(string.Empty, error.Description);
            }
            return Page();
        }

对此:

代码语言:javascript
运行
复制
var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword);
        if (!changePasswordResult.Succeeded)
        {
            TranslateIdentityErrors translateErrors = new();
            foreach (var error in changePasswordResult.Errors)
            {                    
                ModelState.AddModelError(string.Empty, translateErrors.TranslateErrorMessage(error.Code));
            }
            return Page();
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70997569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档