我正在尝试在我的企业中开发应用,并且我已跟随this tutorial访问AD用户信息。含义:
User.Read.All
,在委托权限 User.Read
醇>
完成此操作后,我能够成功登录(Azure AD OAuth2,https://graph.microsoft.com/
作为资源,User.Read
作为范围),并从https://graph.microsoft.com/v1.0/me
获得正确的响应。
有了这个,我的管理员可以在azure portal中看到我的应用程序拥有自己同意的权限。
这是有效的,因为我要求同事登录,我可以从https://graph.microsoft.com/v1.0/me
得到正确的答复,即使他甚至没有提示同意这一点(在管理员同意用户权限之前)提示)
从https://login.microsoftonline.com/common/oauth2/token
申请client_credentials
作为response_type
收到令牌!
向https://graph.microsoft.com/v1.0/users
发送GET请求并收到:
{
"error": {
"code": "Authorization_IdentityNotFound",
"message": "The identity of the calling application could not be established.",
"innerError": {
"request-id": "b2d9ec62-0b65-44eb-9e0f-4aec52b45750",
"date": "2017-03-22T19:19:48"
}
}
}
此外,向https://graph.microsoft.com/v1.0/me
发出请求会返回:
{
"error": {
"code": "BadRequest",
"message": "Current authenticated context is not valid for this request",
"innerError": {
"request-id": "047e2ba9-a858-45fc-a0dd-124e1db503f3",
"date": "2017-03-22T19:39:25"
}
}
}
这让我相信微软知道这个令牌,并且知道它并没有冒充任何用户。
我一直在寻找有关Azure AD和Microsoft Graph身份验证的文档,但我只发现博客帖子,所有内容都过时了(尽管大多数功能都在预览中)。 如果你能指出我正确的方向,我会感谢你。
我在SO上也发现了this和this类似的问题,但它们都没有答案。
之后更新谢谢Dan, 我已经使用了我的组织域名,我也能够获得令牌。
现在https://graph.microsoft.com/v1.0/users/
的回复是:
{
"error": {
"code": "Authorization_RequestDenied",
"message": "Insufficient privileges to complete the operation.",
"innerError": {
"request-id": "3f190b47-73f5-4b29-96f9-54ed3dbc3137",
"date": "2017-03-23T11:07:15"
}
}
}
这没有任何意义,因为在azure门户网站中我有User.Read.All
作为应用程序权限(已经得到管理员同意)。
我认为问题在于令牌的请求,无论我发送的scope
是什么,即使我做了一个,也会成功返回。
例如:
POST https://login.microsoftonline.com/<domain>/oauth2/token
client_id:*******
client_secret:*******
resource:https://graph.microsoft.com/
grant_type:client_credentials
scope:Foo.Bar
返回:
{
"token_type": "Bearer",
"expires_in": "3599",
"ext_expires_in": "0",
"expires_on": "1490271617",
"not_before": "1490267717",
"resource": "https://graph.microsoft.com/",
"access_token": *****
}
答案 0 :(得分:3)
我有两个问题,都没有涵盖文档:
对于客户端凭据,如果应用属于工作或学校(组织)上下文,则https://login.microsoftonline.com/common/oauth2/token
将common
替换为tenantId或域名(感谢Dan Kershaw)
对于https://graph.microsoft.com/v1.0/users
或https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}
,您需要Directory.Read.All
权限。
注意强>:
User.Read.All
时,User.Read
与Microsoft停止向用户请求权限(委派)相关。在Release Notes。答案 1 :(得分:1)
/me
段是当前登录用户的快捷方式或别名。对/me
的请求将永远不会与应用程序令牌一起使用,因为它不包含任何用户上下文(或登录用户) - 因此错误。我们或许能够改善这个错误;)
我相信在使用客户端凭据流时,您需要指定您想要令牌的实际租户。
如果您的应用正在工作或学校(组织)上下文中执行此操作,那么https://login.microsoftonline.com/common/oauth2/token
将common
替换为tenantId或域名,并查看是否有效。
如果您关注https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-client-creds,我们可能会遇到一些我们需要解决的doc bug ...
希望这有帮助,