Добавить пользовательскую функцию для проверки токена JWT - PullRequest
0 голосов
/ 10 января 2019

Я работаю над проектом в ASP.NET Core, в котором я использую токены JWT для аутентификации пользователей.

Я настроил JWTBearerDefaults в моем файле Startup.cs следующим образом:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
 .AddJwtBearer(options =>
 {
     options.TokenValidationParameters = new TokenValidationParameters
     {
         ValidateIssuer = true,
         ValidateAudience = true,
         ValidateLifetime = true,
         ValidateIssuerSigningKey = true,
         ValidIssuer = "some.issuer",
         ValidAudience = "some.issuer",
         ClockSkew = TimeSpan.Zero,
         IssuerSigningKey = new SymmetricSecurityKey(
             Encoding.UTF8.GetBytes(Configuration["SecurityKey"])),
     };

     options.EventsType = typeof(CustomJwtBearerEvents);
 });

Мое требование: при получении вызова API я должен иметь возможность получить токен и выполнить некоторые проверки. Для каждого метода в моем контроллере API я могу проверить токен и выполнить проверки, но я хочу, чтобы эта проверка вызывалась из одного места. Для этого в верхнем коде я добавил строку options.EventsType.

Но проблема в том, что, как только я добавил эту строку, все вызовы API перестали работать, поскольку сервер выдает ошибку 500 internal server error, а также ошибку CORS policy. Но все прекрасно работает без этой строки.

Это ошибка, которую я получаю в своем клиентском браузере:

  • Failed to load resource: the server responded with a status of 500 (Internal Server Error)
  • Access to XMLHttpRequest at 'http://localhost:58402/api/User/GetAllDurations' from origin 'http://localhost:56040' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Есть идеи, почему это происходит? или есть ли другой механизм, где я могу достичь этой цели? Может ли кто-нибудь помочь мне в этом?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Зарегистрировали ли вы класс CustomJwtBearerEvents в контейнере Dependency Injection? Вы можете сделать так, как:

services.AddTransient<CustomJwtBearerEvents>();

Это необходимо, потому что обработчик аутентификации ASP.NET Core пытается создать экземпляр пользовательского типа из контейнера, как вы можете увидеть в коде на GitHub .

Кроме того, если класс CustomJwtBearerEvents имеет зависимости конструктора, они также должны быть зарегистрированы в контейнере DI.

0 голосов
/ 10 января 2019

Это можно сделать с помощью интерфейса ISecurityTokenValidator.

public class MySecurityTokenValidator : ISecurityTokenValidator
{
        public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
        {
           //// Perform your custom validation here.
        }
}

При запуске вам нужно будет настроить эту новую логику, как показано ниже:

        var bearerOptions = new JwtBearerOptions();
        bearerOptions.SecurityTokenValidators.Add(new MySecurityTokenValidator(app.ApplicationServices, Encoding.UTF8.GetBytes("SecurityKey1234567890")));
        app.UseJwtBearerAuthentication(bearerOptions);

Вы можете ссылаться на этот блог для пользовательской реализации.

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