Asp. net Core 2.1 Передача канала аутентификации AzureAd в Web Api, который использует [Authorize] - PullRequest
0 голосов
/ 09 марта 2020

У меня есть базовый веб-интерфейс asp. net, который использует зарегистрированную службу приложений AzureAd для аутентификации.
Его целью будет выступать в качестве серверной службы для внешних интерфейсов пользовательского интерфейса.
Я проверил безопасность функциональность с использованием почтальона, заголовков, авторизации JWT и т. д. c. И это успешно работает.
Теперь я создал интерфейс в asp. net core 2.1 как MVC веб-приложение.
У меня есть вход в AzureAd, работающий в клиентской части.
В качестве теста я попытался ajax запрос к веб-интерфейсу серверной части.
Но я получил 401 несанкционированный ответ, потому что я не знаю, как чтобы передать носитель авторизации в заголовках запроса, я полагаю, что это моя проблема.

У меня вопрос, как это сделать?
Как пройти аутентификацию в asp. net core web api из asp. net core web app?
I Я хотел бы использовать оптимизированный подход, как этот, если это возможно.
И / или есть ли лучший подход?

Спасибо вам за помощь.

1 Ответ

0 голосов
/ 10 марта 2020

Я нашел свой ответ на эту проблему после прочтения запросов на промежуточное ПО и HttpClient. Если кто-то найдет себя в одной лодке, вот как я это решил.

  1. Захват azure токена «Носитель» и сохранение токена на стороне сервера в качестве удостоверения личности пользователя.
  2. Создайте метод для отправки http-запросов в Web Api.

Примерно так:

ПОЛУЧЕНИЕ И ХРАНЕНИЕ ЖЕТОКА Это происходит в вашем файле startup.cs, где вы настраиваете сервисы для AzureAd / OpenIdConnect.

builder.Services.Configure(configureOptions);
        builder.Services.AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureAzureOptions>();
        builder.AddOpenIdConnect(o =>
        {
            //Additional config snipped
            o.Events = new OpenIdConnectEvents
            {
                OnTokenValidated = async context =>
                {
                    ClaimsIdentity identity = context.Principal.Identity as ClaimsIdentity;
                    if (identity != null)
                    {
                        identity.AddClaim(new Claim("access_token", context.SecurityToken.RawData));
                    }
                    System.Diagnostics.Debug.WriteLine(context.SecurityToken.RawData + "\n\n");
                }
            };
        });

СПОСОБ ОТПРАВКИ ВСЕХ HTTP-ЗАПРОСОВ С ЖЕЛЕТОМ АВТОРИЗАЦИИ.

public async Task<IActionResult> AjaxAction(string url)
    {
        if (User.Claims == null) return null;
        System.Security.Claims.Claim claim = User.Claims.SingleOrDefault(s => s.Type == "access_token");
        if (claim == null) return null;

        HttpClient httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", claim.Value);
        string url_e = System.Web.HttpUtility.UrlEncode(url);

        HttpResponseMessage response = await httpClient.GetAsync(url);

        // Here we ask the framework to dispose the response object a the end of the user resquest
        HttpContext.Response.RegisterForDispose(response);

        return new HttpResponseMessageResult(response);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...