AzureAD, клиентское конфиденциальное приложение, вызывающее webapi с пользовательским идентификатором URI приложения, возвращает 401

#asp.net-core #azure-active-directory #asp.net-identity #openid-connect

Вопрос:

Я пытаюсь разработать API, который можно вызывать из разных веб-приложений.

Если я вызываю api с клиентским конфиденциальным приложением, используя область по умолчанию (api://[APIclientId]/.по умолчанию), все работает.

Но если я укажу пользовательский идентификатор URI приложения для регистрации приложения API (например: api://myapi.iss.it) и установлю область действия api://myapi.iss.it/.по умолчанию, я получу HTTP401 из веб-приложения.

Это метод получения токена для веб-приложения для вызова api:

     private async Task PrepareAuthenticatedClient()
    {
        IConfidentialClientApplication app;
        string AURY = String.Format(CultureInfo.InvariantCulture, _config["AzureAd:Instance"]   "{0}", _config["AzureAd:TenantId"]);
        app = ConfidentialClientApplicationBuilder.Create(_config["AzureAd:ClientId"])
            .WithClientSecret(_config["AzureAd:ClientSecret"])
            .WithAuthority(new Uri(AURY))
            .Build();
        var accessToken = await app.AcquireTokenForClient(new string[] { _config["API:scope"] }).ExecuteAsync();
        Console.WriteLine("token: "   accessToken.AccessToken);
        //var accessToken = await _tokenAcquisition.GetAccessTokenForAppAsync(_TodoListScope);
        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken);
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
 

Я замечаю, что Аудитория по-прежнему является api://[APIclientId] в токене, даже если я установлю api:область действия api://myapi.iss.it/.по умолчанию

Это правильно? есть идеи, в чем может быть проблема?

Ответ №1:

Я получил решение на платформе вопросов и ответов Microsoft.

В принципе, я не указывал аудиторию в приложении API, поэтому по умолчанию это был «api://[APIclientId]». Когда API проверял токен приложения (где aud был api://myapi.iss.it), исключение «Microsoft.Идентификационная модель.Жетоны.Было вызвано исключение SecurityTokenInvalidAudienceException», и API вернул 401.

Если у вас такая же проблема, и вы используете Microsoft.Индентиция.Веб-библиотеки, указывающей аудиторию в файле appsetting.json, может быть достаточно.