1

参照トークンを発行するように IdentityServer3 をセットアップしたので、Web API を呼び出すと、IdentityServer にコールバックして、/sts/connect/accesstokenvalidation でアクセス トークンを検証します。

その呼び出しは、多くの場合、実稼働環境では異常に遅くなる可能性があります - 10 から 20 秒の間です。

トレースの例を次に示します。

w3wp.exe Information: 0 : [Thinktecture.IdentityServer.Core.Endpoints.AccessTokenValidationController]: 5/1/2015 8:29:15 PM +00:00 -- Start access token validation request
w3wp.exe Information: 0 : [Thinktecture.IdentityServer.Core.Validation.TokenValidator]: 5/1/2015 8:29:15 PM +00:00 -- Start access token validation
Debug: [Cache]: 5/1/2015 8:29:25 PM +00:00 -- Cache miss: myApp
Debug: [Cache]: 5/1/2015 8:29:26 PM +00:00 -- Cache hit: myApp
w3wp.exe Information: 0 : [Thinktecture.IdentityServer.Core.Validation.TokenValidator]: 5/1/2015 8:29:26 PM +00:00 -- Token validation success {  "ValidateLifetime": true,"AccessTokenType": "Reference","TokenHandle": "ec367c0bee68c8682e000f1526fc7b63"}

w3wp.exe Information: 0 : [Thinktecture.IdentityServer.Core.Endpoints.AccessTokenValidationController]: 5/1/2015 8:29:26 PM +00:00 -- End access token validation request

キャッシュ ヒット/ミス行が疑わしい。

アクセストークンの検証を高速化するために次にどこに行くべきかについてのアイデアはありますか?

4

1 に答える 1

2

遅いコード行はこれです(関数の最初の行の下にも印刷されています)

public async Task<T> GetAsync(string key)
{
    var token = await context.Tokens.FindAsync(key, tokenType);

    if (token == null || token.Expiry < DateTimeOffset.UtcNow)
    {
        return null;
    }

    return ConvertFromJson(token.JsonCode);
}

BaseTokenStore 抽象クラスで Entity Framework OperationalDbContext オブジェクトを初期化しています。

最初の呼び出しだけが遅く、その後の呼び出しは速いことがわかります。したがって、アプリケーションの起動時に次の呼び出しを行うだけで問題を解決し、誰もパフォーマンスのペナルティを支払うことはありません。

var token = await context.Tokens.FindAsync(key, tokenType);

それで解決しました。

于 2015-05-06T16:55:00.663 に答える