Невозможно получить маркер носителя из Azure AD для использования с приложением API
У меня есть приложение MVC, которому требуется доступ к закрытому API-приложению в Azure, защищенному с помощью проверки подлинности Azure AD. Поэтому мне нужно получить токен носителя Azure AD, перенести его в токен Zumo-Auth
и использовать его для доступа к приложению API.
Я прохожу через этот учебник, и все работает нормально до того момента, когда мне нужно запросить маркер у authContext
. Вот фрагмент кода:
var authContext = new AuthenticationContext(
"https://login.microsoftonline.com/MyADDomain.onmicrosoft.com");
ClientCredential credential = new ClientCredential(
"04472E33-2638-FAKE-GUID-F826AF4928DB",
"OMYAPIKEY1x3BLAHEMMEHEHEHEHEeYSOMETHINGRc=");
// Get the AAD token.
var appIdUri =
"https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad";
//var appIdUri = "https://MyADDomain.onmicrosoft.com/MyAppName";
//var appIdUri = "https://MyADDomain.onmicrosoft.com/";
//var appIdUri = "https://graph.windows.net";
AuthenticationResult result =
authContext.AcquireToken(appIdUri, credential); // <-- can't get the token from AD
// downhill from here
var aadToken = new JObject();
aadToken["access_token"] = result.AccessToken;
var appServiceClient = new AppServiceClient(
"https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/");
// Send the AAD token to the gateway and get a Zumo token
var appServiceUser = await appServiceClient.LoginAsync("aad", aadToken);
Линия с authContext.AcquireToken(appIdUri, credential)
- это та, которая вызывает проблемы.
Если в качестве appIdUri
я даю https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad
, то получаю исключение:
Но эта точная строка находится в списке400: AdalServiceException: AADSTS50001: Resource ' https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad ' не зарегистрирован для учетной записи.
Reply Url
в приложении AD
Когда я пытаюсь использовать https://MyADDomain.onmicrosoft.com/MyAppName
или https://MyADDomain.onmicrosoft.com/
как appIdUri
, я получаю другое сообщение об исключении:
400: AdalServiceException: AADSTS50105: приложению '04472E33-2638-FAKE-GUID-F826AF4928DB' не назначена роль для приложения 'https://MyADDomain.onmicrosoft.com/MyAppName '
Или
400: AdalServiceException: AADSTS50105: приложению '04472E33-2638-FAKE-GUID-F826AF4928DB' не назначена роль для приложения ' https://MyADDomain.onmicrosoft.com/'
В обоих случаях у меня был App ID URI
в приложении AD установить в 'https://MyADDomain.onmicrosoft.com/MyAppName ' или ' https://MyADDomain.onmicrosoft.com/'. и оба имени в списке Reply URL
.
В конце концов после достаточного количества попыток я поставил https://graph.windows.net
как appIdUri
и получил знак носителя обратно. Но жетон был выдан с истекшим сроком действия в прошлом (около 1 минуты в прошлом). Так что я больше ничего не мог с этим поделать. И получил 401-Unauthenticated
, когда попытался использовать токен для входа в приложение API.
Кто я такой? пропал?
1 ответ:
Я пошел дальше и следовал учебнику, на который вы ссылались: вызов приложения API Azure из клиента веб-приложения, аутентифицированного Azure Active Directory
- создайте Api Azure API, который возвращает контактные данные
- развертывание приложения API в Службе приложений Azure.
- защитите приложение API с помощью Azure Active Directory.
Затем мне удалось получить маркер, и, как вы можете видеть из следующей демонстрации, мой код ничем не отличается от вашего кода, за исключением того, что он использует более позднюю версию библиотек
using Microsoft.IdentityModel.Clients.ActiveDirectory
, которые используютAsync
.Получить маркер доступа от AAD
class Program { static void Main(string[] args) { var authContext = new AuthenticationContext(Constants.AUTHORITY); var credential = new ClientCredential(Constants.CLIENT_ID, Constants.CLIENT_SECRET); var result = (AuthenticationResult)authContext .AcquireTokenAsync(Constants.API_ID_URL, credential) .Result; var token = result.AccessToken; Console.WriteLine(token.ToString()); Console.ReadLine(); } }
Константы
AUTHORITY
. Первый сегмент этого является https://login.microsoftonline.com конечным сегментом являетсяразрешенный арендатор . Мы установили разрешенного арендатора на portal.azure.com, перейдя к шлюзу для нашего приложения и выбрав параметры > удостоверение > Azure Active Directory > разрешенные клиенты. Мой арендатор-это bigfontoutlook.onmicrosoft.com.
CLIENT_ID
. Мы получаем этот идентификатор клиента из приложения, добавленного в Azure Active Directory. Найти это в manage.windowsazure.com > активный каталог > ваш > приложения > Справочник приложения > Настройки. Как только мы получим его, мы должны добавить его в параметры Azure Active Directory нашего шлюза в поле идентификатор клиента.
CLIENT_SECRET
. Мы создаем / извлекаем это в том же месте, что и наш идентификатор клиента.Вот те, которые работают на меня.
API_ID_URL
. Мы извлеките его в колонке шлюза для нашего приложения Web API, выбрав параметры > удостоверение > Azure Active Directory > URL-адрес приложения.class Constants { public const string AUTHORITY = "https://login.microsoftonline.com/bigfontoutlook.onmicrosoft.com/"; public const string CLIENT_ID = "0d7dce06-c3e3-441f-89a7-f828e210ff6d"; public const string CLIENT_SECRET = "AtRMr+Rijrgod4b9Q34i/UILldyJ2VO6n2jswkcVNDs="; public const string API_ID_URL = "https://mvp201514929cfaaf694.azurewebsites.net/login/aad"; }
Окончательный декодированный JWT
Это то, что содержит декодированный маркер доступа JWT.
{ typ: "JWT", alg: "RS256", x5t: "MnC_VZcATfM5pOYiJHMba9goEKY", kid: "MnC_VZcATfM5pOYiJHMba9goEKY" }. { aud: "https://mvp201514929cfc350148cfa5c9b24a7daaf694.azurewebsites.net/login/aad", iss: "https://sts.windows.net/0252f597-5d7e-4722-bafa-0b26f37dc14f/", iat: 1442346927, nbf: 1442346927, exp: 1442350827, ver: "1.0", tid: "0252f597-5d7e-4722-bafa-0b26f37dc14f", oid: "5a6f33eb-b622-4996-8a6a-600dce355389", sub: "5a6f33eb-b622-4996-8a6a-600dce355389", idp: "https://sts.windows.net/0252f597-5d7e-4722-bafa-0b26f37dc14f/", appid: "0d7dce06-c3e3-441f-89a7-f828e210ff6d", appidacr: "1" }.
Примечание: это одноразовое приложение в одноразовой учетной записи active directory с одноразовой группой ресурсов, поэтому показать мои учетные данные безопасности не проблема.
Диаграмма просто для уверенности :)