さて、いくつかのセキュリティ エンドポイントを持つ 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です。だから、私はステップを持っています:
- 誰かが私の API を呼び出します
- 私の API は、認証プロバイダーとして auth0.com を使用して Jwt トークンを検証します
- 他の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);
}
これは機能しますが、手作業が多すぎてエラーが発生しやすいと思います。
- トークンを生成するために手動で実装する OAuth2 フローが多数あります (クライアント資格情報、暗黙的フロー、認証コード フローなど)。
- リフレッシュ トークン ロジックを実装する必要があります。
- 有効期限がまだ有効な場合は、トークンを再利用するロジックを実装する必要があります。代わりに、毎回新しいトークンを生成します (必要なく毎回 /token エンドポイントをヒットします)。
私は Spring Security フレームワークで多くの作業を行いましたが、「Spring、ここでは OAuth を使用しているので、すべての HTTP リクエストに Bearer トークンを挿入してください」と言うことができます。Spring は、構成で設定したすべてのリクエストをインターセプトし、OAuth フローが尊重されます (クライアント資格情報、認証コード フローなど)。それは透過的であり、時間を無駄にする必要はありません。
Asp Net Core 2.1 でそれを行う方法はありますか、それともトークン生成フローを手動で実装する必要がありますか?