【发布时间】:2015-09-01 13:03:03
【问题描述】:
继我之前的问题:Group claims with Azure AD and OAuth2 implicit grant in ADAL JS 之后,我已经进行了一些设置,以便用户可以使用 Azure/ADAL JS 进行身份验证,然后我使用他们的令牌代表该用户访问 Azure Graph API。这很好用,我可以获取他们的用户和组信息。
但是,我们现在有一个用例,其中另一个系统将在应用程序的上下文中登录我们的应用程序,而不是作为个人用户。我不知道我做得是否正确,但我有第二个 Azure AD 应用程序,其客户端密钥由requesting a token from the AAD API 进行身份验证。我可以获得一个令牌并将其传递给我们的应用程序。但是,我不能再使用该令牌代表该用户(现在是一个应用程序)访问 Azure Graph API。
首先,这真的有可能吗,还是我正在尝试不可能的事情?
如果可能,我必须采取哪些不同的措施才能使其正常工作?它只是 Azure 应用程序中的权限,还是我需要在代码中以不同方式执行?
我用于代表用户访问 Graph API 的代码(删除了异常处理和空检查)是:
var authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
var clientCredential = new ClientCredential("clientId", "key");
var userAssertion = new UserAssertion(((BootstrapContext)identity.BootstrapContext).Token);
var result = await authContext.AcquireTokenAsync("https://graph.windows.net", clientCredential, userAssertion);
return result.AccessToken;
我得到的异常是AADSTS50034: To sign into this application the account must be added to the {directory ID of my main application} directory,错误为invalid_grant。
我似乎无法弄清楚我做错了什么,因为我相信所有 Azure 应用程序都已正确配置,它们至少用于用户身份验证。我还向我的第二个 Azure AD(客户端)应用程序应用了相同的应用程序并将权限委派给其他目录进行用户身份验证所需的权限。
任何帮助将不胜感激。
更新:系统概述/配置
看来我没有提供足够的关于系统配置的上下文,所以让我在这里尝试解决这个问题。
我们有一个在 Azure 中运行的企业 SaaS 应用程序(我们称之为我们的应用程序)。它在 Azure AD 中有一个“应用程序”(我们将其称为我们的 AAD 应用程序以避免混淆)。这是一个多租户 AAD 应用程序,用户通过 AAD 使用 OAuth2 进行身份验证。
作为企业应用程序,我们的客户都有自己的 Azure AD(可能会或可能不会同步到本地 AD)(我们称其为他们的 AAD)。在配置他们的系统以使用我们的应用程序时,我们有一个来自他们的 AAD 的全局管理员授予我们的 AAD 应用程序同意以下 Windows 权限Azure Active Directory(使用管理员同意授权):
- 应用程序权限:
- 读取目录数据
- 委派权限:
- 以登录用户身份访问目录
- 读取目录数据
- 登录并阅读用户资料
当用户浏览到我们的应用程序时,他们将被重定向到 Azure 进行身份验证。经过身份验证后(无论是通过他们的 AAD 还是通过连接到他们的 AAD 的本地 AD),通过 Web 应用程序进行的任何 API 调用都将包含一个不记名令牌。第一次看到每个 Bearer 令牌时,我们使用它来获取 Azure Graph API(代表用户)的新令牌,并查询 Graph API 以获取用户详细信息和组成员身份。当用户使用自己的用户帐户通过 UI 进行身份验证时,这一切都有效。
我们现在要做的就是让我们的客户让另一个下游应用程序(他们的下游应用程序)获得自己的 Bearer 令牌以使用我们的应用程序。这次没有用户,所以我们正在查看client credentials grant flow。为此,我们的客户现在拥有自己的 AAD 应用程序(他们的 AAD 应用程序),该应用程序位于 他们的 AAD 中(已如上所述获得同意)。 他们的下游应用程序可以获得一个不记名令牌来访问我们的应用程序。但是,当我们尝试为 Azure Graph API(代表他们的下游应用程序)获取令牌时,它会失败并显示我在上面粘贴的错误消息。
更新 2
我团队的另一位成员进行了一些调查,这些是他的发现。
我通过查看 SDK 在幕后执行的操作手动完成了该过程 并手动执行所有请求以更好地重现我们正在执行的操作。
所以调用服务(这是 Azure Active Directory 中的 Web 应用程序设置) 从 Azure 获取 OAuth 令牌,即
POST https://login.microsoftonline.com/<tenant-id>/oauth2/token grant_type client_credentials client_id (the client ID of the calling service application in the AD) client secret (the key configured in the calling service application in the AD) resource (the client ID of our web service)我们得到一个包含
appid、tid、oid、iss等的有效令牌,但没有name,upn等(因为它不是用户而是应用程序)。那么我们想从 Graph API 中查找服务主体的详细信息,然后我们 代表应用程序请求获取 Graph API 令牌,即
POST https://login.microsoftonline.com/common/oauth2/token grant_type urn:ietf:params:oauth:grant-type:jwt-bearer client_id (our web service application client ID) client_secret (our web service application client key) resource https://graph.windows.net assertion (the token that was sent by the calling client service, obtained by the process above) requested_token_use on_behalf_of scope openid当我们调用以下代码(从SDK代码中提取)时,基本上会发生这种情况
var authContext = new AuthenticationContext("https://login.microsoftonline.com/common"); var clientCredential = new ClientCredential("clientId", "key"); var userAssertion = new UserAssertion(((BootstrapContext)identity.BootstrapContext).Token); var result = await authContext.AcquireTokenAsync("https://graph.windows.net", clientCredential, userAssertion); return result.AccessToken;它返回的只是:
{ "error": "invalid_grant", "error_description": "AADSTS50034: To sign into this application the account must be added to the <customer tenant id> directory.\r\nTrace ID: <removed>\r\nCorrelation ID: <removed>\r\nTimestamp: 2015-10-08 06:37:58Z", "error_codes": [ 50034 ], "timestamp": "2015-10-08 06:37:58Z", "trace_id": "<removed>", "correlation_id": "<removed>" }所以我想问题是,我们能否代表调用者使用持有者令牌获取图形 API 令牌, 如果调用者是 web/native 应用程序而不是实际用户?
【问题讨论】:
-
您的应用程序是否存在于第二个 Azure AD 中?
-
是的。我同意了全局管理员,就像我通常对我用于用户身份验证的任何其他目录一样。
-
您好,Richard,我们查看了您的问题,但对设置非常困惑,因此我们很难回答您的问题。您能否详细介绍一下您的场景中的特定应用程序(有多少,您是否有多层系统,谁充当客户端,他们联系什么资源,以及在什么上下文中)。
-
@ShawnTabrizi 我已经编辑了我的问题,以提供有关我们的配置以及各个部分如何组合在一起的更多详细信息。我希望这有助于澄清事情。谢谢。
-
我已经成功了,我会发布我的发现作为答案
标签: azure azure-active-directory adal azure-ad-graph-api