Я ищу способы обработки 401 запроса в ErrorController, при этом атрибут [Authorize]
все еще имеет.
Настроен настраиваемый контроллер обработки исключений:
public void Configure(IApplicationBuilder app)
{
//..
app.UseStatusCodePagesWithReExecute("/error/{0}");
app.UseExceptionHandler("/error/500");
//..
}
И контроллер загружается из внешней сборки.Это делает некоторую регистрацию внутри и дополнительную обработку (логика удалена для простоты):
public class ErrorController : Controller
{
[Route("error/{errCode}")]
[HttpGet]
public IActionResult Get(int errCode)
{
if (errCode == StatusCodes.Status500InternalServerError)
{
return StatusCode(StatusCodes.Status500InternalServerError, null);
}
else if (errCode == StatusCodes.Status401Unauthorized)
{
return StatusCode(StatusCodes.Status401Unauthorized);
}
else
{
return BadRequest(null);
}
}
}
Теперь я пытаюсь добавить логику аутентификации для других контроллеров с атрибутом [Authorize]
.Чтобы это работало - я сделал все необходимые конфиги и создал кастом AuthenticationHandler
.Он проверяет, существует ли токен в заголовке HTTP, а затем принимает или отклоняет аутентификацию.
services.AddAuthentication("BasicAuthentication")
.AddScheme<BasicAuthenticationOptions, BasicAuthenticationHandler>("BasicAuthentication", null);
и
public class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions>
{
public BasicAuthenticationHandler(
IOptionsMonitor<BasicAuthenticationOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock
)
: base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!Request.Headers.ContainsKey("Authorization"))
{
return AuthenticateResult.Fail("Missing Authorization Header");
}
var claims = new[] {
new Claim(ClaimTypes.NameIdentifier, Response.Headers["Authorization"]),
new Claim(ClaimTypes.Name, "test"),
};
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
}
Код был упрощен для экономии места.
Итак, моя текущая проблема заключается в том, что теперь я не могу добавить атрибут [Authorize]
к контроллеру ошибок.Потому что, когда я добавляю его, я не могу обработать 401 запрос внутри.
С другой стороны, если я его не добавлю, контроллер будет доступен для несанкционированного доступа.Я ищу способы обработки 401 запроса внутри ErrorController, но при этом у меня все еще есть атрибут [Authorize]
. Идея
1, которую я имел в виду, - сделать функцию ErrorController доступной только извнутри самой службы WebAPI.Есть ли способ, которым я могу ограничить доступ к ErrorController из общего доступа, чтобы внутренние вызовы были возможны, а внешние запросы - нет?
Поиск предложений ..