Сконфигурируйте ASP. NET Промежуточное ПО аутентификации ядра, чтобы оно всегда возвращало 401, когда заголовок авторизации недействителен - PullRequest
1 голос
/ 07 февраля 2020

Я создал стандартное ASP. NET Базовое (2.1) пустое веб-приложение и добавил аутентификацию канала-носителя JWT. Класс Startup.cs выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            var keyByteArray = Convert.FromBase64String(Constants.JwtSecretKey);
            var signinKey = new SymmetricSecurityKey(keyByteArray);
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateAudience = true,
                ValidAudience = Constants.Audience,
                ValidateIssuer = true,
                ValidIssuer = Constants.Issuer,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = signinKey
            };
        });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    app.UseMvc();
}

Контроллер выглядит следующим образом:

[Route("values")]
[ApiController]
public class ValuesController : Controller
{
    [HttpGet("")]
    public IActionResult Get()
    {
        return new StatusCodeResult(StatusCodes.Status200OK);
    }
}

Я хотел бы, чтобы моя конечная точка возвращала код состояния 401 HTTP, когда заголовок авторизации имеет значение присутствует, но недействителен (с сообщением об ошибке, содержащим причину сбоя) - но НЕ при отсутствии заголовка. Можно ли настроить промежуточное ПО таким способом?

Я попытался поиграться с событием OnAuthenticationFailed от JwtBearerEvents, но не смог ничего с этим сделать.

options.Events = new JwtBearerEvents()
{
    OnAuthenticationFailed = context =>
    {
        // Not fired when the Authorization header is "Bearer foo",
        // but fired when the header is "Bearer foo.bar.baz"
        return Task.CompletedTask;
    }
};

1 Ответ

0 голосов
/ 07 февраля 2020

Согласно этому документу , JwtBearerEvents поддерживает только 4 вида событий ниже

  1. OnAuthenticationFailed (это срабатывает только после того, как токен не прошел аутентификацию, в вашем случае, я думаю, вам нужна проверка вместо аутентификации)
  2. OnChallenge
  3. OnMessageReceived
  4. OnTokenValidated (этот, однако, срабатывает только после успешной проверки токена, поэтому я думаю, что он не работает для ваш случай)

То, что вы хотите, должно быть что-то вроде OnTokenValidateFailed, но его там нет, одним из обходных путей будет регистрация событий OnMessageReceived и попытка проверить токен там

services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = "http://localhost:5000";
                    options.RequireHttpsMetadata = false;
                    options.Audience = "api1";
                    options.Events=new JwtBearerEvents(){
                        OnMessageReceived  =context=>{
                            var header =context.Request.Headers["Authorization"];
                            //Your validation logic here
                            //if validate failed
                            //{                           
                            //context.Response.StatusCode=401; 
                            //}                          
                            return Task.CompletedTask;
                        }
                    };
                });

This вы можете проверить токен самостоятельно, однако этот подход может не привести к короткому замыканию всего конвейера запросов и может конфликтовать с другим промежуточным программным обеспечением (не тестировалось с другим промежуточным программным обеспечением, но я предполагаю, что это может произойти)

Добавить ниже со de в вашем Config of start.cs в вашем проекте API

app.Use(async(context,next)=>{
                var authHeader=context.Request.Headers["Authorization"];
                //Your validation here
                if(validation failed)
                {
                  context.Response.StatusCode=401;
                  await context.Response.CompleteAsync();
                }
                else{
                await next.Invoke();}
            });

Добавьте это перед UseAuthenticate, чтобы перезаписать промежуточное ПО по умолчанию будет запускаться всегда, поскольку он зарегистрирован в ядре промежуточного программного обеспечения ядра asp. net, поэтому вы можете выбрать, какой из них

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