Как получить пользовательскую проверку токена-носителя JWT в начале конвейера - PullRequest
0 голосов
/ 06 июня 2018

У меня есть входящий токен с неверной аудиторией.В токене достаточно информации с помощью других утверждений, которые доказывают, какой должна быть аудитория.Я надеялся исправить это рано, чтобы я мог по-прежнему воспользоваться JwtBearerOptions.TokenValidationParameters.ValidateAudience = true;JwtBearerOptions.TokenValidationParameters.ValidAudiences = {"правильный"};

Я могу перехватить событие OnTokenValidated и переписать принципал, но это слишком поздно.Ранее в конвейере токен был проверен, а поскольку аудитория ошибочна, он уже был отклонен.

Я могу обойти это, используя политики авторизации, установив ValidateAudience = false и позаботившись об этом.на уровне контроллера.Мне не нравится добавлять атрибут [Authorize ("the-correct-аудитория")] к каждому контроллеру, потому что кто-то пропустит его.

Другой альтернативой является введение нового промежуточного программного обеспечения, которое работает на identifitiy.claims и отклоняет его.

В конце я хочу иметь возможность глобально отклонять эти токены так, как validateAudience = trueвыполняет, когда validateAudience был отнят у меня как опция фильтрации.

Кто-нибудь делал что-то подобное и какие другие альтернативы вы использовали?

1 Ответ

0 голосов
/ 06 июня 2018

Решение 1: Решите это, введя промежуточное программное обеспечение.ПРИМЕЧАНИЕ: не проверяйте аудиторию

  1. Сначала подключите следующее;

`` `

 JwtBearerOptions = options =>{
 options.Events = new JwtBearerEvents
{
 OnTokenValidated = context =>
 {
    ...
    // this will put in the right aud
    // replace the entire principal
    var appIdentity = new ClaimsIdentity(newClaims);
    var claimsPrincipal = new ClaimsPrincipal(appIdentity);
    context.Principal = claimsPrincipal;
    }
  }
}
Представьте это промежуточное ПО;
Я ищу здесь, но у вас все честно в игре.

`` `

app.UseAuthentication();
app.Use(async (HttpContext context, Func<Task> next) =>
{
            //do work before the invoking the rest of the pipeline       
            if (context.Request.Headers.ContainsKey("x-authScheme") &&
                context.Request.Headers.ContainsKey("Authorization") &&
                context.User != null)
            {
                // looking for bearer token stuff.
                var claims = context.User.Claims;
                var q = from claim in claims
                    where claim.Type == "aud" && claim.Value == "aggregator_service"
                    select claim;
                if (!q.Any())
                {
                    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    return;
                }
            }

            await next.Invoke(); //let the rest of the pipeline run

            //do work after the rest of the pipeline has run     
});

` ``

...