Невозможно получить маркер носителя из 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

URI ответа в приложении Azure 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 4

1 ответ:

Я пошел дальше и следовал учебнику, на который вы ссылались: вызов приложения API Azure из клиента веб-приложения, аутентифицированного Azure Active Directory

  1. создайте Api Azure API, который возвращает контактные данные
  2. развертывание приложения API в Службе приложений Azure.
  3. защитите приложение 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 с одноразовой группой ресурсов, поэтому показать мои учетные данные безопасности не проблема.

Диаграмма просто для уверенности :)

Соединение точек с Azure добавить