9

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

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

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

我按照各种教程/示例(例如ADAL - 服务器到服务器身份验证)中的描述配置了我的 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 端点一起使用也会产生相同的错误。

如果我使用我在此处找到的 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

4 回答 4

6

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

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

来自微软的论坛回答:

Hi,

我们发现在昨天结束的几天时间范围内创建的应用程序出现了一些错误。我们正在继续修复这些应用程序,但我没有一个好的 eta 何时完成。我对这里的影响深表歉意。

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

谢谢

于 2014-03-20T11:52:05.820 回答
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);
于 2016-07-11T13:34:37.933 回答
1

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

我解决了将“Microsoft.IdentityModel.Clients.ActiveDirectory”包升级到“2.6.1-alpha”的问题

于 2014-04-25T01:43:08.730 回答
0

翻译器的 azure 版本再次改变了一切——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. 或者,只需使用查询字符串参数:“Subscription-Key=”

然后将返回的正文作为实际令牌获取 - 它是整个正文,而不是 json 格式。

这比以前使用的方法要简单得多,但事情再次发生变化肯定会很痛苦。

于 2016-11-09T23:00:41.557 回答