为什么 AccessTokenValidation 在我们的 IdentityServer3 实例上这么慢?
Why is AccessTokenValidation so slow on our IdentityServer3 instance?
我们设置 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
缓存 hit/miss 行可疑。
关于下一步要加速访问令牌验证的任何想法?
慢的代码行是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 抽象 class 中的 Entity Framework OperationalDbContext 对象。
原来只有第一次调用慢,后面的调用都快。因此,我们通过在应用程序启动时简单地进行此调用来解决问题,然后没有人支付性能损失:
var token = await context.Tokens.FindAsync(key, tokenType);
这就解决了。
我们设置 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
缓存 hit/miss 行可疑。
关于下一步要加速访问令牌验证的任何想法?
慢的代码行是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 抽象 class 中的 Entity Framework OperationalDbContext 对象。
原来只有第一次调用慢,后面的调用都快。因此,我们通过在应用程序启动时简单地进行此调用来解决问题,然后没有人支付性能损失:
var token = await context.Tokens.FindAsync(key, tokenType);
这就解决了。