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 抽象类中的实体框架 OperationalDbContext 对象。

事实证明,只有第一次调用很慢,后续调用很快。因此,我们通过在应用程序启动时简单地进行此调用来解决问题,然后没有人支付性能损失:

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

那解决了它。

于 2015-05-06T16:55:00.663 回答