Заставить аутентификацию работать с пользовательским обработчиком исключений - PullRequest
0 голосов
/ 01 марта 2019

Я ищу способы обработки 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 из общего доступа, чтобы внутренние вызовы были возможны, а внешние запросы - нет?

Поиск предложений ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...