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