为什么我们的IdentityServer3实例上的AccessTokenValidation这么慢?

时间:2015-05-03 00:55:11

标签: identityserver3

我们设置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

缓存命中/未命中行是可疑的。

关于如何加快访问令牌验证的任何想法?

1 个答案:

答案 0 :(得分:2)

慢的代码行是this one(也在下面打印,函数的第一行)

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);

解决了它。