azure - 使用 .NET Core 的 Azure AD 多租户配置
问题描述
我在 Azure AD 中注册了两个应用程序。一种用于前端应用程序,一种用于 API(.NET Core)。我需要这些应用程序是多租户的。所以我Accounts in any organizational directory (Any Azure AD directory - Multitenant)
在 AzureAD 中为这两个应用程序设置了选择。我正在使用 Azure AD V2.0 端点。我能够id_token
从前端应用程序成功获得。但是当它被传递给 API 时,即使我设置TokenValidationParameters.ValidateIssuer
为false
,它也会尝试验证颁发者并返回 401 Unauthorized 状态。似乎TokenValidationParameters.ValidateIssuer
标志被忽略了。
我在检查日志时注意到不匹配
INFO Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.? [?] - MESSAGE: AzureADJwtBearer was not authenticated. Failure message: IDX10205: Issuer validation failed. Issuer: 'https://sts.windows.net/9967b0b6-c5d3-*************/'. Did not match: validationParameters.ValidIssuer: 'null' or validationParameters.ValidIssuers: 'https://sts.windows.net/{tenantid}/'.
2020-01-13 14:34:51,884 INFO Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.? [?] - MESSAGE: Authorization failed
请注意这里Issuer
是https://sts.windows.net/9967b0b6-c5d3-*************/
但是当我解码时,id_token
我可以看到 Issuer 被设置为"iss":"https://login.microsoftonline.com/9967b0b6-c5d3-*************/v2.0"
我认为 AzureAD V2.0 的正确端点。这可能是上述未经授权退货的原因吗?
下面是ConfigureServices
方法中的认证相关代码Startup.cs
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Authority = options.Authority + "/v2.0/";
options.TokenValidationParameters.ValidateIssuer = false;
});
下面是 appSettings.json 配置
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "my_doamin.com",
"TenantId": "common",
"ClientId": "https://my_doamin.com/api-test"
}
Authorize
具有属性的 API 端点
[Authorize(AuthenticationSchemes = "AzureADBearer")]
[Route("getPotalAdminUsers")]
[HttpGet]
public async Task<IActionResult> getPotalAdminUsers()
{
//Code
}
我经历了一些关于这个问题的SO问题。但没有人帮助我。我很感激这方面的任何帮助。谢谢。
解决方案
我找到了解决方案以及我面临的问题背后的原因。我正在发布答案,以便任何面临相同问题的人都可以解决问题。
我OpenIdConnect middleware
在 Startup.cs 中使用,这是问题背后的原因。OpenIdConnect middleware
当我们需要从我们的应用程序中登录用户时使用。但在我们的上下文中,我们从前端应用程序登录用户。API 不登录用户!API 只需要验证access_token
.
为了验证access_tokens
我们应该使用JwtBearer middleware
而不是OpenIdConnect middleware
.
所以更换
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
options.Authority = options.Authority + "/v2.0/";
options.TokenValidationParameters.ValidateIssuer = false;
});
和
services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
options.Authority = options.Authority + "/v2.0/";
options.TokenValidationParameters.ValidateIssuer = false;
});
有关更多信息,请参阅以下链接
推荐阅读
- javascript - 如何从另一个javascript获取元素
- java - 当该列属于Spring中的复合主键时如何按一列过滤
- python - 用于 reddit 的 feedparser 返回空
- javascript - Vis.js 时间轴 - 如何在不嵌套的情况下折叠组
- android - google_maps_flutter 在 Android 上崩溃 NullPointerException
- r - 正则表达式因美元符号而失败
- sql - 从 SQL 结果集中获取两行之间的日期差异
- amazon-web-services - 旧 SSL 证书优先于新证书
- javascript - 在滚动底部生成 div
- vb.net - 随机图像卡在一张图像上