OAuth2 течет, используя Refit с Asp Net Core 2.1 - PullRequest
0 голосов
/ 23 апреля 2020

Ну, у меня есть WebApi, использующий Asp Net Core 2.1, который имеет некоторые конечные точки безопасности, поэтому у меня есть следующее:

services.AddAuthentication(options =>
            {
              options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
              options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
              options.Authority = configuration["Authorization:Domain"];
              options.Audience = configuration["Authorization:ApiIdentifier"];
              options.TokenValidationParameters = new TokenValidationParameters()
              {
                ValidateLifetime = configuration["Authorization:ValidateLifetime"] == null ? true :
                                   Boolean.Parse(configuration["Authorization:ValidateLifetime"])
              };
              options.RequireHttpsMetadata = configuration["Authorization:RequireHttpsMetadata"] == null ?
                                              true : Boolean.Parse(configuration["Authorization:RequireHttpsMetadata"]);
            });

Это очень хорошо работает, когда кто-то вызывает мой API, проверка в порядке. Я использую http://auth0.com/ в качестве поставщика авторизации.

Теперь мне нужно вызвать другие API, которые также имеют конечные точки безопасности, используя Авторизационный токен (JWT) . В этом случае я должен использовать поток Client Credentials . Итак, у меня есть шаги:

  1. Кто-то вызывает мой API
  2. Мой API проверяет токен JWT, используя auth0.com в качестве поставщика авторизации
  3. Мне нужно вызвать другой API поэтому я использую Refit Library

Мой интерфейс Refit:

public interface IUserInfoApi
  {
    [Get("/api/v2/users/{userId}")]
    [Headers("Authorization: Bearer")]
    Task<UserInfoDto> GetUserInfoAsync(string userId);
  }

И я создал обработчик для добавления токена Bearer в мой запрос:

//refit apis
      services.AddRefitClient<IUserInfoApi>()
      .AddHttpMessageHandler<AuthorizationMessageHandler>()
        .ConfigureHttpClient(c => c.BaseAddress = new Uri(configuration["Api:UserInfo"]));

И мой обработчик:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancelToken)
    {
      HttpRequestHeaders headers = request.Headers;
      AuthenticationHeaderValue authHeader = headers.Authorization;
      if (authHeader != null)
        headers.Authorization = new AuthenticationHeaderValue(authHeader.Scheme, JWT_TOKEN);

      return await base.SendAsync(request, cancelToken);
    }

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

  1. Существует много потоков OAuth2 для реализации вручную, для генерации токена (учетные данные клиента, неявный поток, поток кода авторизации и др.).
  2. Мне нужно реализовать refre sh token logi c.
  3. Мне нужно реализовать некоторые логи c для повторного использования токена, если время его действия еще не истекло, вместо этого каждый раз генерируйте новый токен (конечная точка попадания / токена каждый раз без необходимости).

Я много работал с платформой Spring Security, и я могу просто сказать: "Spring, я использую OAuth здесь, поэтому вставьте Bearer токен в каждом HTTP-запросе, пожалуйста ". Spring перехватывает все запросы, которые я задаю в конфигурации, и поток OAuth соблюдается (учетные данные клиента, поток кодов авторизации и другие), он прозрачен для меня, мне не нужно тратить на это свое время.

Есть ли способ сделать это в Asp Net Core 2.1 или мне нужно вручную реализовать поток генерации токена?

...