У меня есть. net core 3.1 web API. Я хочу защитить конечные точки с помощью токенов на предъявителя от Azure AD.
Я следовал Это руководство . У меня зарегистрировано приложение для API и приложение для клиента.
В своем API я добавил регистрацию для jwt (как указано в коде)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.Audience = Configuration["AzureAd:ResourceId"];
opt.Authority = $"{Configuration["AzureAd:Instance"]}{Configuration["AzureAd:TenantId"]}";
});
А мой раздел конфигурации для API выглядит следующим образом
"AzureAd": {
"ResourceId": "api://<client-id-guid>",
"Instance": "https://login.microsoftonline.com/",
"TenantId": "<tenant-id-guid>"
}
, где client-id-guid
- это идентификатор клиента приложения api (использовалась конфигурация по умолчанию для адреса api: //).
Затем для моего клиента я реализовал тест в новом решении, чтобы получить токен и вызвать защищенную конечную точку.
AadConfiguration config = AadConfiguration.ReadFromJsonFile("appsettings.json");
IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
.WithClientSecret(config.ClientSecret)
.WithAuthority(new Uri(config.Authority))
.Build();
string[] ResourceIds = new string[] {config.ResourceID};
var token = await app.AcquireTokenForClient(ResourceIds)
.ExecuteAsync();
Assert.IsFalse(string.IsNullOrWhiteSpace(token.AccessToken));
var request = new RestRequestBuilder("https://my-api-staging.azurewebsites.net/api")
.WithSegments("health-check", "auth")
.WithBearerToken(token.AccessToken)
.Build();
try
{
var response = await _restHelper.GetJsonAsync<dynamic>(request);
Assert.IsFalse(string.IsNullOrEmpty(response?.serverTime?.ToString()));
}
catch (RestException e)
{
Assert.IsFalse(true, e.ResponseContent);
}
И конфигурация для этого теста
{
"Instance": "https://login.microsoftonline.com/{0}",
"TenantId": "<tenant-id-guid>",
"ClientId": "<client-id-guid>",
"ClientSecret": "<client-secret>",
"ResourceId": "api://<api-client-id-guid>/.default"
}
Tenant Id - это продажа как для API, так и для тестового приложения
Идентификатор клиента - это идентификатор клиента для регистрации клиентского приложения, а его секрет
Идентификатор ресурса - это идентификатор приложения API, это api: // с идентификатором клиента API
Я могу получить токен доступа очень хорошо. Однако, когда я вызываю конечную точку, используя выданный мне токен доступа, я получаю следующую ошибку:
Не удалось найти действительный сертификат с темой 'CN = TODO.azurewebsites. net' на «CurrentUser \ My»
Я не уверен, почему моя аутентификация не проходит, если я выполнил действия, описанные в документе.