gpt4 book ai didi

azure - Azure App Insights 中存在太多(已恢复)异常

转载 作者:行者123 更新时间:2023-12-03 01:22:30 29 4
gpt4 key购买 nike

我遇到问题:Application Insights 出现太多误报,并且正在发送有关异常的邮件,但经过调查,这些邮件不会对我们的应用程序造成任何问题

摘要,TL;DR

这是一个 X->Y 问题。问题Y是AAI正在记录大量服务器异常,请参阅详细解释,并向我们发送警报。问题 X 是 JWT 身份验证中间件抛出有关不匹配 key 的异常,但正在恢复所有切换到不同 OIDC 提供商的异常。结果调用成功。

我可以做什么来修复这些异常或将其列入白名单?

问题 2:异常何时记录到 AAI?仅当它们未被处理或记录器决定时?

上下文

我们的应用程序通过经过身份验证的 Webhook 接收来自 Twilio Sendgrid 的电子邮件数据。它还允许我们的 B2C 租户用户访问应用程序并浏览数据/统计数据。

B2C 不允许客户端凭据流,并且Sendgrid 不支持范围。 最终我们最终使用了两个 OIDC 提供商:用于交互式用户的 Azure AD B2C 和 OpenIddict内存中向我们验证 Sendgrid 服务。

一些代码

    public void ConfigureServices(IServiceCollection services)

services.AddLogging(
configuration => configuration
.AddApplicationInsights()
.SetMinimumLevel(LogLevel.Trace)
.AddConsole()
);

services.ConfigureOpenIddictAuthentication();

services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration)
//.EnableTokenAcquisitionToCallDownstreamApi()
//.AddInMemoryTokenCaches()
;

services.AddAuthorization(authorization => authorization
.AddPolicy("AzureSendgridPolicy", policy => policy
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme,
OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)
)
);
}

public static IServiceCollection ConfigureOpenIddictAuthentication(this IServiceCollection services)
{
services.AddDbContext<OpenIddictDbContext>(ef => ef
// Configure the context to use an in-memory store.
// This prevents multiple cluster instances from deployment
.UseInMemoryDatabase(nameof(OpenIddictDbContext))
// Register the entity sets needed by OpenIddict.
.UseOpenIddict()
)
.AddOpenIddict(options =>
options.AddServer(server => server
.DisableAccessTokenEncryption() //Just for development

//Development: no time to waste on certificate management today
.AddEphemeralEncryptionKey()
.AddEphemeralSigningKey()
.RegisterClaims(OpenIddictConstants.Claims.Role)
.RegisterScopes(OpenIddictConstants.Scopes.Roles)
.SetTokenEndpointUris("/api/v1/Auth/token")
.SetAuthorizationEndpointUris("/api/v1/Auth/authorize")
.AllowClientCredentialsFlow() //Only one supported by Sendgrid
.UseAspNetCore()
.EnableTokenEndpointPassthrough())
.AddCore(core => core.UseEntityFrameworkCore(ef => ef.UseDbContext<OpenIddictDbContext>()))
.AddValidation(validation => validation
.UseLocalServer(_ => {})
.UseAspNetCore(_ => {})
)
)
.AddHostedService<OpenIddictHostedService>()
.AddAuthentication()
;

return services;
}

Azure 应用程序洞察

在AAI上,我发现最常抛出的异常是SecurityTokenUnableToValidateException

AAI dashboard

它被抛出的次数很多,比真实的多得多 401 s。由于开发环境中的临时 key ,每次应用程序重新启动时,OpenIddict 都会重新生成 JWK。

但是仔细观察一些痕迹,我发现这不是一个错误

AAI trace

以下是我的发现:

  • 服务器返回 204
  • 作为涉及的数据库,100%将数据写入数据库(401不涉及EF访问数据库)
  • 异常分析找到异常中指定的JWK

异常分析

查看抛出的异常,这里是来自AAI的描述性文字

IDX10516: Signature validation failed. Unable to match key: 
kid: 'RMHQYNQ4TV9KUHI2EI-INM-XYSOF_1RETVYMWQGE'.
Exceptions caught:
''.
token: '{"alg":"RS256","kid":"RMHQYNQ4TV9KUHI2EI-INM-XYSOF_1RETVYMWQGE","typ":"at+jwt"}.{"sub":"SendgridWebhook","name":"Sendgrid Webhook API","oi_prst":"SendgridWebhook","client_id":"SendgridWebhook","oi_tkn_id":"8d0d5f94-2094-4a21-b84d-304d1d99e3fb","exp":1629910230,"iss":"https://****.azurewebsites.net/","iat":1629906630}'. Valid Lifetime: 'True'. Valid Issuer: 'False'

堆栈跟踪

Microsoft.IdentityModel.Tokens.SecurityTokenUnableToValidateException:
at Microsoft.IdentityModel.Tokens.InternalValidators.ValidateLifetimeAndIssuerAfterSignatureNotValidatedJwt (Microsoft.IdentityModel.Tokens, Version=6.10.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.IdentityModel.Tokens.Jwt, Version=6.10.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (System.IdentityModel.Tokens.Jwt, Version=6.10.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler+<HandleAuthenticateAsync>d__6.MoveNext (Microsoft.AspNetCore.Authentication.JwtBearer, Version=5.0.5.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)

我确定会发生以下情况

  1. 应用程序收到 JWT
  2. 由于注册了多个 OIDC 提供程序,运行时会获取 B2C 和自身应用程序的 JWK
  3. 根据 B2C key 验证 JWT,但失败
  4. 根据自 key 验证 JWT,成功
  5. 已授予访问权限

我相信框架中的某个地方代码结构良好,如下所示。由于有多个提供者需要尝试,只有当所有提供者都失败时才会抛出异常。否则,简单的 for 循环将充当异常的恢复

object principal = null;
Exception toThrow = null;
for (IAuthenticationProvider provider: GetProviders) {
try {
principal = provider.Authenticate(jwt);
} catch(SomeKindOfJwtException ex) {
toThrow = ex;
}
}
if (principal == null) //and perhaps the exception is not null
throw toThrow;

看看那个 JWK RMHQYNQ4TV9KUHI2EI-INM-XYSOF_1RETVYMWQGE ,我可以通过导航轻松找到它 https://***.azurewebsites.net/.well-known/jwks从我的浏览器

{
"keys": [
{
"kid": "RMHQYNQ4TV9KUHI2EI-INM-XYSOF_1RETVYMWQGE",
"use": "sig",
"kty": "RSA",
"alg": "RS256",
"e": "AQAB",
"n": "rMhqYnq4tv9kuHi2Ei-Inm-xysof_1retVymwqGeQ4hnlCRgrMAODGD4qxybhnpufuitEQRckCb4P49O_qafSQ0ocgRRIIuQJc-vLhLJHGp681_9cZT-jGxHnGw5Jdr0NZxH8RwV6cXcmpRN6f2WupujyhLLNwuu8aaTrucHA3JXshib9ad9R96OacT1r6X77HHXdSzURLRWH-f2JFwpBjOvVfJPxW4dzPY0BT7CzP3lxVvGiNXOp4-E8kVz1jER2EP5wO0Ho2qjlIbGUvGF1ui7GxLItldDs-PkZOGGvsO7yS7aeQHSiMTJt7EO-w-ffCJYv-ZColAiHO9jNL0NmQ"
}
]
}

我也做了太多的事,偷看微软的资料。 Here应该是抛出异常的点,也许 here记录异常的位置

最佳答案

What can I do in order to either fix or whitelist these exceptions?

添加telemetry filter 。根据异常遥测,您可以决定放弃遥测。

Question 2: when do exceptions get logged to AAI? Only when they are unhandled or when the logger decides to?

未处理或接到指示时。例如,当使用 ILogger 记录异常时,使用 AAI ILogger ( see docs )

时也会将其记录到 AAI

关于azure - Azure App Insights 中存在太多(已恢复)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68935580/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com