我有一个正在本地开发的 ASP.NET Core Web API。它使用两种不同的身份验证方案,两种都是 JWT 承载方案 - 一种用于“用户”令牌(由我自己的身份提供商颁发),另一种用于由我的 Azure 租户颁发的“服务”令牌。我将在下面添加一些代码来显示这些方案的设置,但我没有做任何不寻常的事情。
最近我发现我的受保护端点在本地开发环境中的响应速度突然变得非常慢 - 响应时间约为 60 秒。我发现这只适用于需要服务令牌的端点。例如,当删除服务令牌要求时,接受用户或服务令牌并使用用户令牌调用的端点响应良好。
此外,如果我在身份验证之前运行的某些中间件中放置一个断点,那么该断点会被快速命中,然后在控制器本身的断点被命中之前会出现巨大的延迟。
所以我得出结论,JWT 承载身份验证中间件内部的某些内容导致应用程序挂起。但我不知道这可能是什么。我尝试使用 Fiddler 检查我的应用程序产生的内部网络流量(
netsh winhttp set proxy 127.0.0.1:8888
),但没有什么特别长时间运行的。下面是痕迹。这里值得注意的一件事是没有向 Azure 租户众所周知的发现文档发出任何请求。前两个请求是针对我自己的用户令牌的发现文档。其他一切似乎都与 App Insights 相关。
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom
12 200 HTTPS my.identity.local:44119 /.well-known/openid-configuration 2,104 application/json; charset=UTF-8 identity.app:800
13 200 HTTPS my.identity.local:44119 /.well-known/openid-configuration/jwks 463 application/json; charset=UTF-8 identity.app:800
17 200 HTTP www.msftconnecttest.com /connecttest.txt 22 max-age=30, must-revalidate text/plain svchost:3132
18 502 HTTP ipv6.msftconnecttest.com /connecttest.txt 512 no-cache, must-revalidate text/html; charset=UTF-8 svchost:3132
24 200 HTTPS fe2cr.update.microsoft.com /v6/ClientWebService/client.asmx 2,155 private text/xml; charset=utf-8 svchost:8068
34 502 HTTP ipv6.msftconnecttest.com /connecttest.txt 512 no-cache, must-revalidate text/html; charset=UTF-8 svchost:3132
35 200 HTTP www.msftconnecttest.com /connecttest.txt 22 max-age=30, must-revalidate text/plain svchost:3132
47 200 HTTPS fe2cr.update.microsoft.com /v6/ClientWebService/client.asmx 2,149 private text/xml; charset=utf-8 svchost:8068
我还尝试过利用 JWT 承载事件。服务方案中唯一被命中的两个是
MessageReceived
(命中速度非常快)和 AuthenticationFailed
(在长时间延迟之后,正如预期的那样,因为所使用的令牌不是服务令牌),因此没有任何线索。
很难相信如此巨大的延迟是受CPU限制的,但我真的不知道我还能做些什么来调查。你们以前遇到过这种情况吗?任何提示都会令人惊奇,因为拥有如此缓慢的开发环境真是令人沮丧。就像我说的,这只是最近几天才开始的,我几乎没有接触过 API 代码库。我是否可能受到某种 Azure 速率限制?我有一个付费 Azure 帐户。正如所承诺的,这是我用来设置此身份验证方案的扩展方法:
private static void AddServiceTokenAuthenticationIfRequired(this AuthenticationBuilder authBuilder, IServiceCollection services, AuthenticationSettings settings)
{
if (!settings.SupportServiceTokens)
{
return;
}
services.AddSingleton<CustomServiceAuthenticationEvents>();
var tenantId = settings.TenantId ?? throw new Exception("Token tenant not configured");
var authority = $"https://sts.windows.net/{tenantId}";
var audience = settings.DefaultTokenAudience ?? throw new Exception("Token audience not configured");
authBuilder.AddJwtBearer(AuthenticationSchemes.Service, options =>
{
options.Audience = audience;
options.Authority = new Uri(authority).AbsoluteUri;
options.TokenValidationParameters.NameClaimType = JwtClaimTypes.Subject;
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.ValidIssuers = [$"{authority}/"];
options.TokenValidationParameters.ValidateAudience = true;
options.TokenValidationParameters.ValidateIssuerSigningKey = true;
options.TokenValidationParameters.ValidateLifetime = true;
options.TokenValidationParameters.LogValidationExceptions = true;
options.EventsType = typeof(CustomServiceAuthenticationEvents);
options.MapInboundClaims = false;
});
}
好吧,在我用头撞墙 24 小时后,我发现我的开发笔记本电脑和 Microsoft 之间的巨大延迟是由我安装的 Cloudflare WARP 应用程序 造成的,据说是为了加快我的互联网速度。我无法解释它,但这个应用程序过去曾给我带来其他网络不稳定的问题,所以我只是卸载它。顺便说一句,禁用/卸载修复了该问题,该问题适用于我的计算机和 Azure 资源之间的所有通信,而不仅仅是身份验证支持资源。