3

環境:

基本的なトークンの発行と検証は、私たちの環境では正常に機能しています。現在、サイレント リフレッシュ テクニックを有効にしようとしています (ここに記載されています)。を有効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
    }
}

ただし、GETUserInfo エンドポイントへの 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 を追加します。

UserInfo エンドポイントへの <code>OPTIONS</code> リクエスト UserInfo エンドポイントへの <code>GET</code> リクエスト 結果としてブラウザに表示される Cookie

4

2 に答える 2