web-dev-qa-db-fra.com

Pourquoi AcquireToken avec ClientCredential échoue-t-il avec invalid_client (ACS50012)?

Pourquoi mon application Azure AD n'autorise-t-elle pas une autorisation oauth client_credentials?

Je souhaite utiliser l’API Azure Graph, mais j’ai d’abord besoin d’un jeton oauth. Pour obtenir le jeton, j'essaie d'utiliser Microsoft.IdentityModel.Clients.ActiveDirectory, également appelé ADAL version 1.0.3 (de NuGet).

J'utilise la surcharge de AuthenticationContext.AcquireToken qui prend un objet ClientCredential. (Je ne peux pas utiliser la surcharge qui invite l'utilisateur à se connecter car j'écris un service, pas une application.)

J'ai configuré mon application Web Azure AD comme décrit dans divers didacticiels/exemples (par exemple/ ADAL - Authentification serveur à serveur ).

Mon code ressemble à:

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/thommmondago.onmicrosoft.com");
ClientCredential cc = new ClientCredential("41151135-61b8-40f4-aff7-8627e9eaf853", clientSecretKey);
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);

La ligne AcquireToken lève une exception:

sts_token_request_failed: Token request to security token service failed.  Check InnerException for more details

L'exception interne est une WebException et la réponse reçue ressemble à une erreur oauth:

{ "error":"invalid_client",
 "error_description":"ACS50012: Authentication failed."
 "error_codes":[50012],
 "timestamp":"2014-03-17 12:26:19Z",
 "trace_id":"a4ee6702-e07b-40f7-8248-589e49e96a8d",
 "correlation_id":"b304af2e-2748-4067-99d0-2d7e55b121cd" }

Ignorer ADAL et utiliser curl avec le noeud final oauth génère également la même erreur.

Mon code fonctionne si j'utilise les détails de l'application Azure que j'ai trouvés ici :

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/graphDir1.onmicrosoft.com");
ClientCredential cc = new ClientCredential("b3b1fc59-84b8-4400-a715-ea8a7e40f4fe", "FStnXT1QON84B5o38aEmFdlNhEnYtzJ91Gg/JH/Jxiw=");
AuthenticationResult result = ac.AcquireToken("https://graph.windows.net", cc);

Donc, ce n'est pas une erreur avec mon code. Je pense que c'est soit une erreur avec Azure AD, soit que les paramètres ClientCredential sont incorrects.

9
tjleigh

Cela s'est avéré être une erreur dans Windows Azure, il n'y avait aucun problème avec mon code ou ma configuration.

Une fois que Microsoft a résolu le problème dans Azure, je devais créer une nouvelle application et celle-ci a commencé à fonctionner.

Réponse de Microsoft au forum:

Hi,

Nous constatons des erreurs avec des applications créées sur plusieurs jours et se terminant hier. Nous continuons à réparer ces applications, mais je n'ai pas de bonne idée quand cela sera fait. Je m'excuse pour l'impact ici.

Pouvez-vous essayer de créer une nouvelle application et de relancer l'opération avec le nouvel ID client?

merci

6
tjleigh

Consultez ce lien: https://Azure.Microsoft.com/en-gb/documentation/articles/resource-manager-net-sdk/

La dernière version de la bibliothèque d'authentification Active Directory ne prend pas en charge la méthode AcquireToken. Vous devez utiliser la méthode AcquireTokenAsync. 

var result = await authenticationContext.AcquireTokenAsync(resource: "https://{domain}.onmicrosoft.com/{site-if applicable}", clientCredential: credential);
2
Arun Kumar

J'avais le même problème mais je n'exécutais le code directement à partir d'Azure (dans un site Web Azure).

J'ai résolu la mise à niveau du package 'Microsoft.IdentityModel.Clients.ActiveDirectory' vers '2.6.1-alpha'

1
emmekappa

La version Azure du traducteur a de nouveau changé la donne. La demande de jeton Oauth utilise une nouvelle URL et n'a besoin que de votre clé secrète, au lieu de tous les autres bagages. Cette page en parle (mais en utilisant le code PHP): http://www.bradymoritz.com/php-code-for-bingmicrosoftazure-translator/

Les éléments clés sont: 

  1. Envoyez une demande vide à https://api.cognitive.Microsoft.com/sts/v1.0/issueToken
  2. Transmettez votre clé secrète en utilisant l'en-tête "Ocp-Apim-Subscription-Key:"
  3. Ou bien, utilisez simplement le paramètre querystring: "Subscription-Key ="

Ensuite, obtenez le corps du retour sous forme de jeton - c'est le corps entier, pas au format JSON. 

C'est beaucoup plus simple que la méthode utilisée auparavant, mais il serait certainement pénible que les choses aient encore changé. 

0
Brady Moritz