Azure Active Directory图Api允许您对登录用户执行操作 .
https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/signed-in-user-operations
我不知道如何代表签名用户获取Graph API的访问令牌 .
我可以为我的Web应用程序获取访问令牌,但这不代表特定用户:
var authContext = new AuthenticationContext(authorityString);
var result = await authContext.AcquireTokenAsync
(
"https://graph.windows.net",
clientCredential // Application ID, application secret
);
string accessToken = result.Token;
此外,当用户登录时,我会收到授权码(通过AuthorizationCodeReceived通知) . 我可以将此授权码转换为访问令牌 . 这可能是用户的访问令牌,但Graph Api无法识别 . (想想看,我不知道这个访问令牌有什么用......)
var authContext = new AuthenticationContext(authorityString);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync
(
authorizationCode,
redirectUri, // eg http://localhost:56950/
clientCredential // Application ID, application secret
);
string accessToken = result.AccessToken;
使用第一个访问令牌,我可以在我的Active Directory租户上运行查询 . 例如,调用 https://graph.windows.net/thisisnotmydomain.onmicrosoft.com/users?api-version=1.6
给了我一个用户列表 .
但是如果尝试URL: https://graph.windows.net/me?api-version=1.6
,我得到这个结果:
{
"odata.error": {
"code": "Request_ResourceNotFound",
"message": {
"lang": "en",
"value": "Resource not found for the segment 'me'."
}
}
}
这是有道理的,因为我从未指定过用户 . 如果我使用 AcquireTokenByAuthorizactionCodeAsync
获取的访问令牌,则会收到错误消息"Access Token missing or malformed."显然,这不是图形API访问令牌 .
如何获取适用于已登录用户的Graph API访问令牌?
1 回答
你在那里做了什么是客户端凭证授予流程 . 应用程序使用它来代表用户访问API,而不是应用程序本身 . 因此,如果您的应用程序有权在没有用户上下文的情况下从API读取数据,那么您就可以使用它 .
但是,要在用户上下文中进行调用,您需要以不同的方式执行某些操作 .
如果这是一个Web应用程序,您可能会使用授权代码授权流程,其中用户的浏览器将重定向到Azure AD . 在同意您的应用后,他们会使用授权码转发回您的应用 . 然后,您可以使用代码以及您的客户端ID和密码来交换此代码以获取访问令牌 . 以下是一个示例应用程序:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect,特别关注:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs .
如果这是本机应用程序,则必须弹出浏览器进行身份验证 . 这是由ADAL自动完成的,因此您无需做太多工作 . 以下是一个示例UWP应用程序:https://github.com/Azure-Samples/active-directory-dotnet-windows-store . 特别关注这里:https://github.com/Azure-Samples/active-directory-dotnet-windows-store/blob/master/TodoListClient/MainPage.xaml.cs#L108 . 这里还有一个示例WPF应用程序:https://github.com/Azure-Samples/active-directory-dotnet-native-desktop . WPF应用程序的功能也可以应用于控制台应用程序,winforms应用程序等 .
你可以在这里找到所有样品:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-code-samples .
如果您有更多问题,请随时在评论中提问:)
附:另一种选择是密码授予流,您可以在其中向Azure AD发送用户名,密码,客户端ID和密码以获取访问令牌 . 这种方法有很多问题可以提出,所以我不建议这样做 . 如果您可以在浏览器窗口中使用向用户显示登录屏幕的那些,请使用它们 .
使用授权代码进行第二次调用的问题是它没有指定资源URI . 像这样打电话解决了这个问题: