Всем привет, я сейчас решаю такую проблему: у меня в API есть двухфакторная авторизация, для некоторых пользователей, состояние прохождения авторизации я храню только в токене. Первый фактор я проверяю через тег [Authorize], второй - через кастомный тег [Authorize(Policy = "TwoFactorPolicy")] (одновременно оба). Фактически проверка работает правильно работает, но мне необходимо в случае если пользователь авторизовался первым фактором, но не авторизовался вторым, возвращать разные сообщения об ошибке в ответе то есть сделать что-то вроде return Unauthorized("custom message"), или можно просто другой код об ошибке, не принципиально, главное, чтобы на фронтенде можно было понять, на каком этапе авторизации находится пользователь. Вот код моего кастомного Handler
public class TwoFactorAuthorizationHandler : AuthorizationHandler<TwoFactorAuthorizationRequirement> {
private readonly ITwoFactorAuthHelpService _twoFactorAuthService;
private readonly ILogger<TwoFactorAuthorizationHandler> _logger;
private readonly ITokenService _tokenService;
private readonly IUserHelpService _userHelpService;
private readonly IHttpContextAccessor _httpContextAccessor;
public TwoFactorAuthorizationHandler(ILogger<TwoFactorAuthorizationHandler> logger, ITwoFactorAuthHelpService twoFactorAuthService,
ITokenService tokenService, IUserHelpService userHelpService, IHttpContextAccessor httpContextAccessor) {
_logger = logger;
_twoFactorAuthService = twoFactorAuthService;
_tokenService = tokenService;
_userHelpService = userHelpService;
_httpContextAccessor = httpContextAccessor;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, TwoFactorAuthorizationRequirement requirement) {
string username = context.User.FindFirst(ClaimTypes.Name)?.Value;
string? token = _httpContextAccessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", "");
if (string.IsNullOrEmpty(username)) {
_logger.LogWarning("Username is missing in the claims.");
context.Fail();
return;
}
if (string.IsNullOrEmpty(token)) {
_logger.LogWarning("No token found in Authorization header.");
context.Fail();
return;
}
bool hasUserTwoFactorEnabled = _twoFactorAuthService.HasUserEnabledTwoFactor(username);
bool hasUserTwoFactorRequired = _userHelpService.isTwoFactorAuthenticationRequired(username);
bool isTokenTwoFactor = _tokenService.ValidateTwoFactorToken(token);
if (hasUserTwoFactorRequired && isTokenTwoFactor == false) {
_logger.LogWarning($"User {username} requires 2FA but token does not confirm 2FA.");
context.Fail();
return;
}
if (hasUserTwoFactorEnabled && isTokenTwoFactor == false) {
_logger.LogWarning($"User {username} has enabled 2FA but token does not confirm it.");
context.Fail();
return;
}
context.Succeed(requirement);
}
}
Сможет кто-то подсказать, возможно ли вообще добавлять кастомные сообщения в этот тег, и как это сделать?