我们有一个在 Azure 应用服务中运行的 ASP NET Core We API (.NET8)。我们正在使用 Microsoft Identity Web (2.16.1) 并像这样配置启动
services
.AddMicrosoftIdentityWebApiAuthentication(this.Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
services.AddAuthentication()
.AddMicrosoftIdentityWebApi(this.Configuration, "AzureAdB2C", "B2CScheme", true);
通过 Azure Ad 保护的控制器操作的属性如下:
[HttpPost]
[Authorize(AuthenticationSchemes = "Bearer")]
[Route("requests")]
public async Task<IActionResult> RequestPush([Required] NotificationRequest notificationRequest)
使用 Azure Ad B2C 保护的控制器操作的属性如下:
[HttpDelete()]
[Authorize(AuthenticationSchemes = "B2CScheme")]
[Route("installations/{installationId}")]
public async Task<ActionResult> DeleteInstallation([Required][FromRoute] string installationId)
控制器操作有效,但我们在 AppInsights 中收到不必要的令人困惑的警告。例如,当进行 Azure Ad B2C 调用时,我们会得到
失败: Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter[0] ufeff IDX40001:发行者:'https://{TenantName}.b2clogin.com/{TenantId}/v2.0/', 与为此申请提供的任何有效发行人都不匹配。
尽管呼叫成功,但仍然如此。我们是否只是忽略这些警告
通过查看警告,它并不一定表明或表明身份验证失败,但解决该问题非常重要,以便更清楚地了解并确保您的应用程序配置正确。
我观察到的另一件事是应用程序中配置的发行者与令牌实际来自的发行者之间不匹配。警告消息中的发行人是:
https://{TenantName}.b2clogin.com/{TenantId}/v2.0/
这与为申请提供的任何有效发行人都不匹配。
配置中与此警告相关的代码或语句行是 Azure AD B2C 身份验证方案的配置:
services.AddAuthentication()
.AddMicrosoftIdentityWebApi(this.Configuration, "AzureAdB2C", "B2CScheme", true);
在此配置中,您将指定身份验证方案(“B2CScheme”)并将其与“AzureAdB2C”选项关联。这可能就是不匹配的根源。
除了适当的日志记录、测试、URL 配置更新之外,您还可以做一些事情。我建议您验证发行人配置。
在 ASP.NET Core 应用程序中,您必须在 appsettings.json 文件中或通过环境变量配置颁发者。一个你应该如何做的例子:
{
"AzureAdB2C": {
"Instance": "https://{tenantName}.b2clogin.com/",
"Domain": "{tenantName}.onmicrosoft.com",
"ClientId": "{yourClientId}",
"SignUpSignInPolicyId": "{yourSignUpSignInPolicyId}",
"ResetPasswordPolicyId": "{yourResetPasswordPolicyId}",
"EditProfilePolicyId": "{yourEditProfilePolicyId}"
}
}
注意: 在此配置中,“实例”指定 B2C 租户的基本 URL。
因此,从令牌验证发行者,因为当令牌可能被发行时,其信息包含有关发行者的信息。您可以从令牌中提取此信息,以验证它是否与应用程序中配置的颁发者匹配。这是如何在 C# 代码中验证颁发者的示例:
using Microsoft.IdentityModel.Tokens;
public class TokenValidator
{
private readonly string _expectedIssuer;
public TokenValidator(IConfiguration configuration)
{
_expectedIssuer = configuration["AzureAdB2C:Instance"] + configuration["AzureAdB2C:Domain"] + "/{policy}/v2.0/";
}
public bool ValidateToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
// Check if the issuer matches the expected issuer
return jwtToken?.Issuer == _expectedIssuer;
}
}
注意: _expectedIssuer 是根据 appsettings.json 中的配置构建的。 您应该将 "{policy}" 替换为 B2C 配置中使用的适当策略名称。然后,您将使用 TokenValidator 验证应用程序中的令牌并确保它们是由预期的发行者发行的。
通过在应用程序中配置发行者并根据令牌的发行者进行验证,您可以确保它们匹配并避免与发行者不匹配相关的警告。