環境:
- 暗黙的なフローをサポートするIdentityServer4インスタンス
- oidc-client-jsを使用した Angular 7 クライアント アプリ
- IdentityServer3 Katana アクセス トークン検証ミドルウェアを使用する ASP.NET Framework Web API リソース
基本的なトークンの発行と検証は、私たちの環境では正常に機能しています。現在、サイレント リフレッシュ テクニックを有効にしようとしています (ここに記載されています)。を有効automaticSilentRenew
にして短いAccessTokenLifetime
.
IS4 の UserInfo エンドポイントへの 2 つの後続の呼び出しを確認できます (下のスクリーンショットを参照)。1 つ目は、CORS プリフライトOPTIONS
リクエストです。のカスタム実装のブレークポイントで、IProfileService.IsActiveAsync()
このリクエストが正常に認証されたことを確認できます (を調べることによりhttpContext
)。
public class ProfileService : IProfileService
{
private readonly HttpContext _httpContext;
public ProfileService(IHttpContextAccessor httpContextAccessor)
{
_httpContext = httpContextAccessor.HttpContext;
}
...
public async Task IsActiveAsync(IsActiveContext context)
{
var temp = _httpContext.User; // breakpoint here
// call external API with _httpContext.User info to get isActive
}
}
ただし、GET
UserInfo エンドポイントへの 2 番目の要求 ( ) は認証されません。私のブレークポイントIProfileService.IsActiveAsync()
は、ユーザーが認証されていないことを示しているため、ユーザーがアクティブかどうか (別の API を呼び出す) を確認するためのルーチンは、401 に変換される false を返します。失敗したGET
要求でこのヘッダーを確認できますWWW-Authenticate: error="invalid_token"
。
これIdentityTokenLifetime
よりも小さいを指定しようとしましたが、成功しませんでしたAccessTokenLifetime
。
2 つの要求のログは次のとおりです。
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 OPTIONS http://localhost:5000/connect/userinfo
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 8.5635ms 204
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5000/connect/userinfo
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
IdentityServer4.Hosting.IdentityServerMiddleware:Information: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.UserInfoEndpoint for /connect/userinfo
IdentityServer4.Validation.TokenValidator:Error: User marked as not active: f84db3aa-57b8-48e4-9b59-6deee3d288ad
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 94.7189ms 401
質問:
GET
サイレント リフレッシュ中に UserInfo エンドポイントへの要求を取得して認証するにはどうすればよいHttpContext
ですか?
アップデート:
@Anders による回答を調査するために、2 つのリクエストのすべてのヘッダーのスクリーンショットと結果のブラウザー Cookie を追加します。