Доступ к API веб-сайта из демона с использованием Azure AD - PullRequest
0 голосов
/ 02 марта 2020

Мы создали базовый веб-сайт ASP. net и добавили к нему API, к которому нам нужен доступ от демона. Веб-сайт защищен с помощью Azure AD, а демон аутентифицируется с помощью Azure. В демоне я использую те же учетные данные приложения, которые использует сайт для получения токена, но когда я пытаюсь получить доступ к API веб-сайта с помощью токена, я перенаправляюсь на страницу входа Microsoft. Я не уверен, что мне не хватает. Я получаю токен доступа.

Я также пытался следовать указаниям на https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-daemon-app-configuration?tabs=dotnet, прежде чем использовать приведенный ниже код HttpClient.

using (var _client = new HttpClient())
{
    var Content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("grant_type", "client_credentials"),
        new KeyValuePair<string, string>("client_id", ClientID),
        new KeyValuePair<string, string>("client_secret", ClientSecret)
    });

    var Response = await 
    _client.PostAsync($"https://login.microsoftonline.com/[tenantUUID]/oauth2/token", Content);
    if (Response.IsSuccessStatusCode) 
    { 
        var Token = JsonConvert.DeserializeObject<Data.Token>(await Response.Content.ReadAsStringAsync());

        Console.WriteLine("AccessToken: " + Token.access_token);

        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.access_token);

        Response = await _client.GetAsync("https://localhost:44318/api/notify");
        Console.Write(await Response.Content.ReadAsStringAsync());
    }
}

1 Ответ

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

После дополнительного поиска я обнаружил, что у меня возникли две проблемы: веб-сайт не настроен на прием Azure AD токенов, и что-то заставляет мой код HttpClient не запрашивать нужную информацию.

Чтобы настроить сайт для приема Azure AD токенов, я изменил свой файл startup.cs, так что теперь в разделе services.AddAuthentication читается:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options))
    .AddAzureADBearer(options => Configuration.Bind("AzureAd", options)); 

Это позволяет использовать только один метод проверки подлинности по умолчанию работать так, что либо пользовательский вход работает, либо канал-носитель работает в зависимости от того, на что установлен AzureADDefaults. Вы можете указать, какой из них использовать, что я и сделал в своем API, украсив класс:

[Authorize(AuthenticationSchemes = AzureADDefaults.BearerAuthenticationScheme)]

Это сломано в ASP. net 2.2, но должно работать в 3.0 (из чего Я читаю). Чтобы обойти это, измените его на:

[Authorize(AuthenticationSchemes = "AzureADBearer")]

Если вы хотите разрешить токен на предъявителя и обычные имена входа, добавьте AzureAD в строку:

[Authorize(AuthenticationSchemes = "AzureADBearer, AzureAD")]

Что касается HttpClient проблема, я не уверен, что не так, но я также переключился на код Microsoft и использовал ConfidentialClientApplication для создания запроса и получения токена, и он работает сейчас, вместе с startup.cs изменениями.

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