获取 Microsoft Graph API 的有效访问令牌
Obtaining a valid access token for Microsoft Graph API
我正在开发一个 ASP.NET MVC5 Web 应用程序,它使用 Azure ADAL 库来验证用户身份,它工作正常,但是,当我手动向图形发送请求时,例如:GET https://graph.microsoft.com/v1.0/me or GET https://graph.microsoft.com/v1.0/groups? $filter=from/displayName eq 'whatever'.
我尝试更新 Azure 中的应用程序注册以添加所需的图形权限,我也尝试创建新的应用程序注册,无论我做什么,我的请求总是响应 401 未经授权,我有什么事吗不见了?
编辑:邮递员的回复示例
{
"error": {
"code": "InvalidAuthenticationToken",
"message": "Access token validation failure.",
"innerError": {
"request-id": "a142576b-acce-4e59-8a8d-adede61aaf59",
"date": "2017-04-05T13:27:36"
}
}
}
编辑:C# 请求示例
public async Task<GroupGraph> GetGroupIdByDisplayName(string displayName)
{
var accessToken = await authenticationService.GetTokenUserOnly();
GroupGraph groupGraphResponse = null;
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/groups?$filter=from/displayName eq '{displayName}'"))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using (var response = client.SendAsync(request).Result)
{
if (response.IsSuccessStatusCode)
{
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
groupGraphResponse = JsonConvert.DeserializeObject<GroupGraph>(result);
}
}
}
}
}
return groupGraphResponse;
}
编辑:我获取令牌的方式
public async Task<string> GetTokenUserOnly()
{
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
// get a token for the Graph without triggering any user interaction (from the cache, via multi-resource refresh token, etc)
ClientCredential clientcred = new ClientCredential(clientId, appKey);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's database
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID, new TableTokenCache(signedInUserID));
//AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenSilentAsync(graphResourceID, clientcred, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(graphResourceID, clientcred);
return authenticationResult.AccessToken;
}
您不能使用 ADAL 获取图形的令牌。microsoft.com。 ADAL 用于图形。windows.net.
为了获取图形库 (graph.windows.com) 的标记,查看 Nuget 包 Microsoft.Graph。 Microsoft 也有一些关于如何使用 Graph 提取用户信息的 documentation。
不过请注意,同时使用图形库和 ADAL 库可能会导致一些奇怪的副作用,例如清除凭据缓存。
您似乎正在使用客户端凭据授予流程来获取图形的访问令牌 api(graphResourceID
是 https://graph.microsoft.com
?):
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(graphResourceID, clientcred);
因此您需要在 Azure 广告门户中授予应用权限:
对于错误“Access token validation failure”,您可以使用像http://jwt.calebb.net/这样的在线工具来解码您的访问令牌,检查访问令牌的受众或生命周期。
要获取 Microsoft Graph API 的有效令牌,您可以使用 Azure.Identity
.
要使用 TokenCredential
的任何实现,我们需要构建自己的 IAuthenticationProvider
。
public class TokenCredentialAuthenticationProvider : IAuthenticationProvider
{
private readonly TokenCredential _tokenCredential;
public TokenCredentialAuthenticationProvider(TokenCredential tokenCredential)
{
_tokenCredential = tokenCredential;
}
public async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
var accessToken = await _tokenCredential.GetTokenAsync(new TokenRequestContext(new[] { "https://graph.microsoft.com" }), CancellationToken.None);
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken.Token);
}
}
现在我们可以使用 AzureCliCredential 来获取访问令牌。
打开 Powershell 并输入 az login
以使用您的 Azure AD 帐户登录。
在 Azure 中,您还可以使用 Managed Identity
获取基于 Azure 资源的令牌,例如Azure 应用服务。这里需要用到ManagedIdentityToken
.
用法:
var client = new GraphServiceClient(new TokenCredentialAuthenticationProvider(new AzureCliCredential()));
var user = await client.Me.Request().GetAsync();
我正在开发一个 ASP.NET MVC5 Web 应用程序,它使用 Azure ADAL 库来验证用户身份,它工作正常,但是,当我手动向图形发送请求时,例如:GET https://graph.microsoft.com/v1.0/me or GET https://graph.microsoft.com/v1.0/groups? $filter=from/displayName eq 'whatever'.
我尝试更新 Azure 中的应用程序注册以添加所需的图形权限,我也尝试创建新的应用程序注册,无论我做什么,我的请求总是响应 401 未经授权,我有什么事吗不见了?
编辑:邮递员的回复示例
{
"error": {
"code": "InvalidAuthenticationToken",
"message": "Access token validation failure.",
"innerError": {
"request-id": "a142576b-acce-4e59-8a8d-adede61aaf59",
"date": "2017-04-05T13:27:36"
}
}
}
编辑:C# 请求示例
public async Task<GroupGraph> GetGroupIdByDisplayName(string displayName)
{
var accessToken = await authenticationService.GetTokenUserOnly();
GroupGraph groupGraphResponse = null;
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage(HttpMethod.Get, $"https://graph.microsoft.com/v1.0/groups?$filter=from/displayName eq '{displayName}'"))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using (var response = client.SendAsync(request).Result)
{
if (response.IsSuccessStatusCode)
{
using (var content = response.Content)
{
var result = await content.ReadAsStringAsync();
groupGraphResponse = JsonConvert.DeserializeObject<GroupGraph>(result);
}
}
}
}
}
return groupGraphResponse;
}
编辑:我获取令牌的方式
public async Task<string> GetTokenUserOnly()
{
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
// get a token for the Graph without triggering any user interaction (from the cache, via multi-resource refresh token, etc)
ClientCredential clientcred = new ClientCredential(clientId, appKey);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's database
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID, new TableTokenCache(signedInUserID));
//AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenSilentAsync(graphResourceID, clientcred, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(graphResourceID, clientcred);
return authenticationResult.AccessToken;
}
您不能使用 ADAL 获取图形的令牌。microsoft.com。 ADAL 用于图形。windows.net.
为了获取图形库 (graph.windows.com) 的标记,查看 Nuget 包 Microsoft.Graph。 Microsoft 也有一些关于如何使用 Graph 提取用户信息的 documentation。
不过请注意,同时使用图形库和 ADAL 库可能会导致一些奇怪的副作用,例如清除凭据缓存。
您似乎正在使用客户端凭据授予流程来获取图形的访问令牌 api(graphResourceID
是 https://graph.microsoft.com
?):
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(graphResourceID, clientcred);
因此您需要在 Azure 广告门户中授予应用权限:
对于错误“Access token validation failure”,您可以使用像http://jwt.calebb.net/这样的在线工具来解码您的访问令牌,检查访问令牌的受众或生命周期。
要获取 Microsoft Graph API 的有效令牌,您可以使用 Azure.Identity
.
要使用 TokenCredential
的任何实现,我们需要构建自己的 IAuthenticationProvider
。
public class TokenCredentialAuthenticationProvider : IAuthenticationProvider
{
private readonly TokenCredential _tokenCredential;
public TokenCredentialAuthenticationProvider(TokenCredential tokenCredential)
{
_tokenCredential = tokenCredential;
}
public async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
var accessToken = await _tokenCredential.GetTokenAsync(new TokenRequestContext(new[] { "https://graph.microsoft.com" }), CancellationToken.None);
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken.Token);
}
}
现在我们可以使用 AzureCliCredential 来获取访问令牌。
打开 Powershell 并输入 az login
以使用您的 Azure AD 帐户登录。
在 Azure 中,您还可以使用 Managed Identity
获取基于 Azure 资源的令牌,例如Azure 应用服务。这里需要用到ManagedIdentityToken
.
用法:
var client = new GraphServiceClient(new TokenCredentialAuthenticationProvider(new AzureCliCredential()));
var user = await client.Me.Request().GetAsync();