我们设置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
缓存命中/未命中行是可疑的。
关于如何加快访问令牌验证的任何想法?
答案 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);
解决了它。