Azure AD многопользовательская конфигурация с. NET Core - PullRequest
0 голосов
/ 13 января 2020

У меня есть два приложения, зарегистрированные в 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 статус «Неавторизованный». Кажется, флаг 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 Я вижу, что эмитент установлен как "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"
}

Конечная точка API с атрибутом Authorize

[Authorize(AuthenticationSchemes = "AzureADBearer")]
[Route("getPotalAdminUsers")]
[HttpGet]
public async Task<IActionResult> getPotalAdminUsers()
{
    //Code
}

Я рассмотрел несколько вопросов SO по этой проблеме. Но никто не помог мне. Я ценю любую помощь в этом. Спасибо.

1 Ответ

0 голосов
/ 14 января 2020

Я нашел решение и причину проблемы, с которой столкнулся. Я публикую ответ, чтобы любой, кто сталкивается с той же проблемой, мог ее устранить.

Я использовал 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

...