3

Я создал webapi, защищенный активной лазурной директорией. Мне нужно проверить это сейчас и попытаться использовать скрипач с заголовком авторизации. Я пытаюсь создать токен с кодом ниже.Azure AAD - аудитория недействительна

Target obj = (Target)cmbTarget.SelectedItem; 

AuthenticationResult authenticationResult; 
string aadInstance = obj.AADInstance; // "https://login.windows.net/{0}"; 
string tenant = obj.Tenant; //"rudderless.onmicrosoft.com"; 
string apiResourceId = obj.ApiResourceId; //"15b4ac7f-23a8-4958-96a5-64159254690d"; 
string clientId = obj.ClientId; // "47cdc6c3-226a-4c38-b08e-055be8409056"; 

Uri redirectUri = new Uri(obj.RedirectUri); //new Uri("http://nativeclient"); 
string authority = string.Format(aadInstance, tenant); 
authContext = new AuthenticationContext(authority); 

authenticationResult = this.authContext.AcquireToken(apiResourceId, 
          clientId, redirectUri, PromptBehavior.Always); 

txtToken.Text = authenticationResult.AccessToken; 
Clipboard.SetText($"Bearer {txtToken.Text}"); 

Я получаю маркер успешно создан и когда я использую маркер для вызова WebAPI это метание 401 с сообщением

WWW-Authenticate: Знаменосец ошибка = "invalid_token", error_description = " аудитория недействительна»

+0

Насколько я знаю, вы можете настроить «Аудитория» как «ИДЕНТИФИКАТОР CLIENT» или «URI идентификатора APP» вашего приложения Web API, защищенного AD. Согласно предоставленной вами ошибке, я предположил, что вы можете попробовать проверить аудиторию в приложении веб-API и ResourceId в своем клиентском приложении. –

+0

Любое решение здесь? Имеет ту же проблему. – SolarX

ответ

3

Я думаю, что это важно, чтобы пересмотреть различные этапы аутентификации, и, надеюсь, через обсуждение вы сможете решить эту проблему вы имеете.

Когда клиент пытается получить токен доступа к ресурсу, ему необходимо указать AAD, для какого ресурса он хочет получить токен. Клиент может быть настроен на вызов нескольких ресурсов, все с разными конфигурациями, поэтому ожидается, что ресурс всегда указывается в запросе токена доступа.

Ресурс может быть GUID идентификатора приложения для ресурса или допустимым URI идентификатора приложения, зарегистрированным в ресурсе. AAD должен иметь возможность однозначно идентифицировать, какой ресурс вы пытаетесь достичь, основываясь на ценности, которую вы предоставляете. Однако обратите внимание, что если вы используете GUID идентификатора приложения, вы получите токен от AAD, где претензия аудитории - это идентификатор GUID приложения. В качестве альтернативы, если вы используете URI идентификатора приложения, вы увидите этот URI в качестве заявки аудитории в токене.

В обеих ситуациях вы получите токен для «того же» ресурса, но требование в токене будет выглядеть по-разному. Кроме того, возможно, что один ресурс приложения может иметь несколько URI идентификаторов приложений, зарегистрированных в их приложении. В зависимости от того, какой из них вы используете в запросе аутентификации, вы получите другую претензию аудитории в токене, который соответствует параметру ресурса, который вы передали.

Наконец, как только вы получите токен, вы отправляете его в API ресурсов который будет проверять токен для нескольких вещей, таких как: Идентификатор идентификатора клиента, Претензии по областям/ролям, метод аутентификации (требование «acr») и , определенно, что требования аудитории соответствуют ожидаемым!

Это означает, что API-интерфейс ресурса в конечном итоге должен сказать: «Я принимаю < GUID идентификатора приложения> в качестве действительной заявки на аудиторию» ... или «Я принимаю < идентификатор идентификатора приложения> в качестве действительной заявки на аудиторию». Такая логика может быть встроена в используемую вами библиотеку (например, OWIN), но вам нужно убедиться, что на вашей стороне API вы правильно настроили ее для ожидающих аудиторий. Вы могли бы, если хотите, сделать так, чтобы ваш API не проверял претензию аудитории вообще! Все претензии в токене являются открытым текстом, и, следовательно, вы действительно можете делать все, что хотите, но в этой ситуации у вас не будет очень безопасного API:]

Конец дня, я подозреваю, что эта ошибка наступает из вашего собственного API, и это происходит потому, что вы не настроили приложение, чтобы принять заявку на участие в аудитории, которая соответствует идентификатору GUID вашего идентификатора ресурса (который выглядит так, как вы передаете, когда вы получаете токен на основе вашего образца кода).

Я надеюсь, что это решает вашу проблему!

1

У меня была та же проблема. Мысль об обмене. Я изменил Web Api Audience на ClientId веб-приложения. После этого он работает.

+0

Можете ли вы сказать мне, где именно вы это сделали? – Ron16