为什么带有ClientCredential的AcquireToken会因invalid_client(ACS50012)而失败?

时间:2014-03-17 14:28:02

标签: azure oauth .net-4.0 azure-active-directory adal

为什么我的Azure AD应用程序不允许oauth client_credentials授权?

我想使用Azure Graph API,但首先我需要一个oauth令牌。要获取令牌,我正在尝试使用Microsoft.IdentityModel.Clients.ActiveDirectory又称ADAL版本1.0.3(来自NuGet)。

我使用带有ClientCredential对象的AuthenticationContext.AcquireToken的重载。 (我无法使用提示用户登录的重载,因为我正在编写服务,而不是应用。)

我按照各种教程/示例(例如ADAL - Server to Server Authentication)中的说明配置了我的Azure AD Web应用程序。

我的代码如下:

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);

AcquireToken行抛出异常:

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

内部异常是WebException,收到的响应看起来像是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" }

绕过ADAL并使用curl和oauth端点也会产生相同的错误。

如果我使用我找到的here

的Azure应用程序的详细信息,则我的代码可以正常工作
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);

所以我的代码不是错误。我认为它是我的Azure AD的错误,或者我的ClientCredential参数错误。

4 个答案:

答案 0 :(得分:6)

这在Windows Azure中是一个错误,我的代码或配置没有任何问题。

Microsoft解决了Azure中的问题后,我不得不创建一个新的应用程序并开始工作。

Forum answer from Microsoft:

Hi,
     

我们看到在昨天结束的几天时间范围内创建的应用程序出现了一些错误。我们正在继续修复这些应用程序,但是当我们完成这些应用程序时,我不会有很好的eta。我为这里的影响道歉。

     

您可以尝试创建新的应用程序并使用新的客户端ID重新安排操作吗?

     

感谢

答案 1 :(得分:2)

请看一下这个链接:https://azure.microsoft.com/en-gb/documentation/articles/resource-manager-net-sdk/

最新版本的Active Directory身份验证库不支持AcquireToken方法,而是必须使用AcquireTokenAsync方法。

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

答案 2 :(得分:1)

我遇到了同样的问题,但只是直接从Azure运行代码(在Azure网站内)。

我解决了将'Microsoft.IdentityModel.Clients.ActiveDirectory'软件包升级为'2.6.1-alpha'的问题

答案 3 :(得分:0)

译员的蔚蓝版本再次改变了 - Oauth令牌请求使用了新的URL,只需要你的密钥,而不是所有其他行李。本页讨论它(但使用PHP代码):http://www.bradymoritz.com/php-code-for-bingmicrosoftazure-translator/

关键项目是:

  1. 将空请求发布到https://api.cognitive.microsoft.com/sts/v1.0/issueToken
  2. 使用标题“Ocp-Apim-Subscription-Key:”
  3. 将密钥传递给它
  4. 或者,只需使用querystring参数:“Subscription-Key =”
  5. 然后将返回的主体作为实际令牌 - 它是整个身体,而不是json格式。

    这比之前使用的方法简单得多,但事情再次发生变化肯定是一种痛苦。