为什么我的 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 参数错误。