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呼び出しをOnMessageReceivedbodyに移動して、結果をそこにキャッシュすることができるかどうか疑問に思っています。