IDプロバイダー(IDP)としてWSO2を使用しています。「X-JWT-Assertion」というヘッダーにJWTを配置しています。
これをASP.NET Coreシステムにフィードするために、OnMessageReceived
イベントを追加しました。これによりtoken
、ヘッダーで指定された値にを設定できます。
ここに私がそれをしなければならないコードがあります(重要な部分は非ブラケットコードの最後の3行です):
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddJwtBearer(async options =>
{
options.TokenValidationParameters =
await wso2Actions.JwtOperations.GetTokenValidationParameters();
options.Events = new JwtBearerEvents()
{
// WSO2 sends the JWT in a different field than what is expected.
// This allows us to feed it in.
OnMessageReceived = context =>
{
context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
return Task.CompletedTask;
}
}
};
これはすべて、サービスが起動した後の最初の呼び出しを除いて、完全に機能します。明確にするために、最初の呼び出しを除くすべての呼び出しは、期待どおりに機能します。(トークンを挿入し、User
必要に応じてオブジェクトを更新します。)
しかし、最初の呼び出しでOnMessageReceived
は、ヒットしません。そして、User
私のコントローラーのオブジェクトはセットアップされていません。
HttpContext
最初の呼び出しを確認したところ、「X-JWT-Assertion」ヘッダーがRequest.Headers
リストに含まれています(JWTが含まれています)。しかし、どういうわけか、そのOnMessageReceived
イベントはそのために呼ばれていません。
OnMessageReceived
サービスのサービス操作の最初の呼び出しでどのように呼び出されますか?
重要な注意:問題がasync
await
にあることがわかりましたAddJwtBearer
。(以下の私の回答を参照してください。)それがこの質問に本当に欲しかったものです。
恵みがcancledすることはできませんので、しかし、私はまだ使用する方法を示すことができる誰にも報奨金を授与されますAddJwtBearer
とasync
await
、それは実際の待っているところHttpClient
コールを。またはasync
await
、がでの使用が想定されていない理由のドキュメントを表示しますAddJwtBearer
。
async
await
呼び出しパイプラインでうまく機能しなかったためでした。)
AddJwtBearer
(および基礎となるAuthenticationBuilder.AddSchemeHelper
、それだけでsericesにIConfigureOptionsを追加する-そこに非同期呼び出しを期待しないでください)。OnMessageReceived
一方で、-が待たれています。したがって、そのOnMessageReceived
ラムダを非同期にして、http呼び出しをOnMessageReceived
bodyに移動して、結果をそこにキャッシュすることができるかどうか疑問に思っています。