我尝试更新Azure中的应用程序注册以添加所需的Graph权限,并且我还尝试创建新的应用程序注册,无论我做什么,我的请求始终会响应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.微软也有关于如何拉用户的文档信息使用图.但是请注意,同时使用图形库和ADAL库会导致一些怪异的副作用,例如清除凭据缓存.I am working on an ASP.NET MVC5 Web App that uses Azure ADAL libraries to authenticate users, it works fine, however, when I manually send requests to graph, ex: GET https://graph.microsoft.com/v1.0/me or GET https://graph.microsoft.com/v1.0/groups?$filter=from/displayName eq 'whatever'.I have tried updating the App Registration in Azure as to add the required Graph permissions, and I have also tried creating new app registrations, no matter what I do my requests will always respond 401 Unauthorized, is there anything I am missing?EDIT: Example response from Postman{ "error": { "code": "InvalidAuthenticationToken", "message": "Access token validation failure.", "innerError": { "request-id": "a142576b-acce-4e59-8a8d-adede61aaf59", "date": "2017-04-05T13:27:36" } }}EDIT: C# Request Examplepublic 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; }EDIT: The way I obtain the tokenpublic 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; } 解决方案 You can't use ADAL to get tokens for graph.microsoft.com. ADAL is for graph.windows.net.In order to get tokens for the Graph library (graph.windows.com) look into the Nuget Package Microsoft.Graph. Microsoft also has some documentation on how to pull user info using Graph.Be forewarned though, using Graph Libraries and ADAL libraries side by side can lead to some weird side effects, such as the credential cache being cleared. 这篇关于获取Microsoft Graph API的有效访问令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-23 02:04
查看更多