首页 > 解决方案 > 使用 .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.ValidateIssuerfalse,它也会尝试验证颁发者并返回 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

请注意这里Issuerhttps://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问题。但没有人帮助我。我很感激这方面的任何帮助。谢谢。

标签: azure.net-coreazure-active-directory

解决方案


我找到了解决方案以及我面临的问题背后的原因。我正在发布答案,以便任何面临相同问题的人都可以解决问题。

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;
        });

有关更多信息,请参阅以下链接

https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/wiki/How-ASP.NET-Core-uses-Microsoft.IdentityModel-extensions-for-.NET


推荐阅读