Подключите JWT к свойству User в контроллере - PullRequest
0 голосов
/ 29 октября 2019

У меня есть служба Web API .NET Core 3.0. Он получает заголовок, содержащий JWT с утверждениями.

Я добавил следующее в ConfigureServices в Startup.cs, чтобы сопоставить мой JWT с системой проверки подлинности .NET Core:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(configureOptions =>
{
    configureOptions.Events = new JwtBearerEvents()
    {
        OnMessageReceived = context =>
        {
            context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
            return Task.CompletedTask;
        }
    };
});

Я также добавил app.UseAuthentication(); к Configure в Startup.cs.

Затем я запускаю свою службу и вызываю для нее операцию HTTP GET. Когда я это делаю, я вижу, что context.Token настроен на мой JWT. Если я перенесу этот JWT на https://JWT.io, это покажет, что у него много утверждений.

Но точка останова в операции GET показывает, что User.Claims пусто. Чтокогда-либо необходимо подключить JWT к пользователю, не происходит.

Вот варианты, которые я пробовал:

  • Добавить [Authorize] над моим контроллером:
    Результат: 401 Ошибка: неавторизован
  • Добавить [Authorize(JwtBearerDefaults.AuthenticationScheme)] над моим контроллером
    Результат: Поле AuthorizationPolicy с именем 'Bearer' не найдено.
  • Добавьте services.AddAuthorization() в ConfigureServices и [Authorize] над моим контроллером
    Результат: 401 Ошибка: неавторизовано
  • Добавьте [Authorize(JwtBearerDefaults.AuthenticationScheme)] над моим контроллером и кодом ниже для ConfigureServices:
services.AddAuthorization(auth =>
    {
        auth.AddPolicy(JwtBearerDefaults.AuthenticationScheme, 
            new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
    });

Результат: 401 Ошибка: неавторизовано

Чтобы было ясно, я не хочу делать авторизацию, но я прочитал, что добавление может бытьнеобходимо сопоставить заявки с пользователем.

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

1 Ответ

1 голос
/ 29 октября 2019

Я подозреваю, что в вашей конфигурации что-то не так. В методе ConfigureServices оно должно быть следующим:

services.AddAuthentication(options =>
{
   options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
       ValidateIssuer = true,
       ValidateAudience = true,
       ValidateLifetime = true,
       ValidateIssuerSigningKey = true,
       ValidIssuer = Configuration["Jwt:Issuer"],
       ValidAudience = Configuration["Jwt:Issuer"],
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
    };
});

Тогда в методе Configure оно должно быть следующим:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...................

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization(); // These two must be before `UseEndpoints` and after `UseRouting`

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
...