3

好吧,我有一个使用 Asp Net Core 2.1 的 WebApi,它有一些安全端点,所以我有以下内容:

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/作为授权提供者。

现在我还需要使用Authorization Bearer Token (JWT)调用其他具有安全端点的 API 。在这种情况下,我应该使用的流程是Client Credentials。所以,我有以下步骤:

  1. 有人调用我的 API
  2. 我的 API 使用 auth0.com 作为授权提供者来验证 Jwt 令牌
  3. 我需要调用其他 API,所以我正在使用 Refit Library

我的改装界面:

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. 我必须实现刷新令牌逻辑。
  3. 如果到期时间仍然有效,我必须实现一些逻辑来重用令牌,而是每次都生成一个新令牌(每次都不需要命中 /token 端点)。

我在 Spring Security 框架上做了很多工作,我只能说:“Spring,我在这里使用 OAuth,所以请在每个 HTTP 请求中插入 Bearer 令牌”。Spring,拦截我在配置中设置的所有请求,并且尊重 OAuth 流(客户端凭据、授权代码流等),它对我来说是透明的,我不需要浪费我的时间。

有什么方法可以在 Asp Net Core 2.1 中实现,或者我需要手动实现令牌生成流程?

4

0 回答 0