2017-03-29 2 views
0

J'ai un client natif qui appelle un service que j'ai écrit - qui à son tour appelle l'API graphique (en utilisant les informations d'identification de l'appelant d'origine).Comment configurer l'authentification au nom de l'utilisateur dans un environnement multi-locataires?

C'est exactement comme l'échantillon « onbehalfof » trouvé ici (mon code ne la même manière que l'échantillon):

https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof

Lorsque vous vous connectez en tant qu'utilisateur du même locataire que le service (locataire A), tout fonctionne bien (comme la part de l'échantillon). Lors de la connexion en tant qu'utilisateur d'un locataire différent (locataire B), je reçois une exception à cette ligne dans la fonction:

result = await authContext.AcquireTokenAsync(GraphResourceId, clientCred, userAssertion); 

(cette ligne est de 153 TodoListController.cs dans l'échantillon onbehalfof).

L'exception est la suivante:

AADSTS65001: L'utilisateur ou l'administrateur n'a pas consenti à utiliser l'application avec ID 'de2fb28b-83f8-419d-9b00-3fbce0a60bf4. . Envoyer une demande d'autorisation interactive pour cet utilisateur et des ressources \ r \ nTrace ID: 6865c420-674a-4adf-a070-3d9b9c500200 \ r \ nCorrelation ID: 7e088563-d7fe-4131-a05c-cbe04dbb2bbd \ r \ nTimestamp: 2017 -03 à 29 22: 56: 58Z

l'ID d'application ci-dessus se réfère à la fonction I écrit (qui est la même ligne dans la TodoListService dans le onbehalfofsample).

J'ai tout configuré pour l'authentification multi-locataire. Mais c'est l'appel supplémentaire que mon service effectue vers un autre service (API graphique) à l'origine du problème. Quelle configuration supplémentaire dois-je faire dans le portail Azure pour que cela fonctionne?

Répondre

0

Ça marche maintenant. J'ai dû faire deux changements pour le faire fonctionner. D'abord, côté service, passez à l'utilisation de "common" en tant que locataire. J'avais passé à commun sur le client, mais ne savais pas que vous aviez à faire sur le côté service ainsi:

<add key="ida:Tenant" value="common" /> 

En second lieu, changer le GraphUserUrl sur le service à l'adresse suivante:

<add key="ida:GraphUserUrl" value="https://graph.windows.net/me?api-version=1.6" /> 

L'URL d'origine de l'exemple ne fonctionnait pas (au moins pour les utilisateurs d'un autre locataire).

+0

Ces "commentaires" doivent être modifiés dans le message d'origine. –

0

Dans les instructions écrites pour l'échantillon que vous lien ci-dessus, ils abordent cette question avec la section suivante:

Configurer les applications clientes connues

Pour l'API Web de niveau intermédiaire pour pouvoir appelez l'API Web en aval, l'utilisateur doit accorder au niveau intermédiaire l'autorisation de le faire sous la forme de consentement. Parce que le niveau intermédiaire n'a aucune interface utilisateur interactive, vous devez lier explicitement l'inscription de l'application cliente dans Azure AD avec l'enregistrement pour l'API Web, qui fusionne le consentement requis par le niveau intermédiaire client & en un seul dialogue. Vous pouvez le faire en ajoutant "ID client" de l'application cliente, au manifeste de l'API Web dans la propriété knownClientApplications. Voici comment:

  1. Accédez à l'enregistrement de votre application "TodoListService" et ouvrez l'éditeur de manifeste.
  2. Dans le manifeste, recherchez la propriété tableau knownClientApplications et ajoutez l'ID client de votre application cliente en tant qu'élément.

    Votre code doit ressembler à ce qui suit une fois que vous avez terminé: "knownClientApplications": ["94da0930-763f-45c7-8d26-04d5938baab2"]

  3. Enregistrez le TodoListService manifeste en cliquant sur le bouton « Enregistrer ».

Mon hypothèse est que parce que vous utilisez ce problème, que vous ne l'avez pas fait cette configuration particulière.

L'autre option que vous avez est de demander explicitement le consentement entre le niveau intermédiaire et l'API Graphe AAD. Vous pouvez le faire en demandant à un administrateur locataire de se connecter et d'accepter votre service de niveau intermédiaire. Tout ce que vous devez faire est de générer une URL de connexion avec l'ID d'application de niveau intermédiaire.

Cependant, je vous recommande fortement de le faire de manière documentée, car cela offrira une meilleure expérience à vos utilisateurs.

+0

Ce n'est pas ça. J'ai bien défini les applicationsClientClient correctement. Si je n'avais pas, lors de la connexion en tant qu'utilisateur d'un autre locataire, l'appel dans le service aurait échoué (et je n'aurais jamais obtenu à la ligne 153 dans l'échantillon). L'exemple fonctionne comme annoncé: lorsque vous vous connectez en tant qu'utilisateur du même locataire que le service. Mais si vous vous connectez en tant qu'utilisateur d'un autre locataire, il échoue avec l'erreur ci-dessus. Des idées? –

+0

"qui fusionne le consentement requis par le client et le niveau intermédiaire dans un seul dialogue" ... Qu'avez-vous vu dans votre dialogue de consentement? –

+0

Voir la réponse où j'ai inclus une capture d'écran de la boîte de dialogue de consentement. –

0

est ici la boîte de dialogue de consentement qui apparaît lorsqu'un utilisateur d'un autre journaux locataire dans:

Consent Dialog

+0

Veuillez fournir une capture d'écran de votre manifeste. –

+0

J'ai ajouté une réponse avec les captures d'écran pour mon client et mon manifeste de service. –