У меня есть два приложения, зарегистрированные в 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 по этой проблеме. Но никто не помог мне. Я ценю любую помощь в этом. Спасибо.