Безопасный ASP. Net Core 3.1 API с токенами на предъявителя из Azure AD - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть. 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»

Я не уверен, почему моя аутентификация не проходит, если я выполнил действия, описанные в документе.

1 Ответ

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

Я могу получить токен доступа очень хорошо. Однако, когда я вызываю конечную точку, используя выданный мне токен доступа, я получаю следующую ошибку:

Я следую инструкции и тестирую на своем сайте, который работает очень хорошо.

После получения токена доступа вы можете попробовать использовать его в почтальоне для отправки запроса в core api. Хотя ядро ​​API имеет версию 3.1, у него нет /api для маршрутизации.

enter image description here

И вы можете использовать HttpClient для вызова основной webapi.

var token = await app.AcquireTokenForClient(ResourceIds).ExecuteAsync();
var accesstoken = token.AccessToken;
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accesstoken);
    var requestURl = new Uri($"https://xxxx.azurewebsites.net/weatherforecast");
    var response = client.GetAsync(requestURl).Result;
    string result = response.Content.ReadAsStringAsync().Result;
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...