当前位置: 首页 > 知识库问答 >
问题:

Azure Active Directory图形API-已登录用户的访问令牌

吕冠宇
2023-03-14

Azure Active Directory图形Api允许您对登录的用户执行操作。

https://msdn.microsoft.com/en-us/library/azure/ad/graph/api/signed-in-user-operations

var authContext = new AuthenticationContext(authorityString);
var result = await authContext.AcquireTokenAsync
             (
                "https://graph.windows.net",
                 clientCredential  // Application ID, application secret
             );
string accessToken = result.Token;
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;
   {
     "odata.error": {
                       "code": "Request_ResourceNotFound",
                      "message": {
                                   "lang": "en",
                                   "value": "Resource not found for the segment 'me'."
                                  }
                    }
  }

这很有意义,因为我从未指定用户。如果使用AcquireTokenByAuthorizActionCodeAsync获得的访问令牌,则会收到错误消息“访问令牌丢失或格式错误”。显然,这不是一个图形API访问令牌。

我如何为Graph API获得一个访问令牌,它适用于已登录的用户?

共有1个答案

穆单鹗
2023-03-14

您在那里所做的是客户端凭据授予流。它被应用程序用来访问API,而不是代表用户,而是代表应用程序本身。因此,如果您的应用程序有权在没有用户上下文的情况下从API中读取数据,那么您将使用这一权限。

但是,要在用户上下文中进行调用,您需要做一些不同的事情。

如果这是一个web应用程序,您可能会使用授权代码授予流,在该流中用户的浏览器被重定向到Azure AD。在对您的应用程序给予同意后,它们会被转发回您的应用程序,并带有授权代码。然后,您可以使用代码、客户端id和机密将此代码交换为访问令牌。下面是这样做的示例应用程序:https://github.com/azure-samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/todolistwebapp/app_start/startup.auth.cs。

如果这是一个原生app,你将不得不弹出一个浏览器来做身份验证。这是由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/develope/active-directory-code-samples。

如果您有更多的问题,可以在评论中询问:)

使用授权代码的第二个调用的问题是它没有指定资源URI。这样调用可以解决问题:

var result = await authContext.AcquireTokenByAuthorizationCodeAsync
         (
              authorizationCode,
              redirectUri, // eg http://localhost:56950/
              clientCredential, // Application ID, application secret
              "https://graph.windows.net/"
         );
 类似资料:
  • 当我使用graph explorer(https://developer.microsoft.com/en-us/graph/graph-explorer)调用graph API(如teams API)时,它会自动为我提供一个访问令牌,该令牌具有执行任务(如创建团队和添加人员)的权限和身份验证。

  • 现在我么可以改进 new_topic 视图,将发布主题的用户设置当前登录的用户,取代之前直接从数据库查询出来的第一个用户,之前这份代码是临时的,因为那时候还没有方法去获取登录用户,但是现在可以了: boards/views.py (完整代码) from django.contrib.auth.decorators import login_required from django.shortcut

  • 本文向大家介绍在Django中限制已登录用户的访问的方法,包括了在Django中限制已登录用户的访问的方法的使用技巧和注意事项,需要的朋友参考一下 有很多原因需要控制用户访问站点的某部分。 一个简单原始的限制方法是检查 request.user.is_authenticated() ,然后重定向到登陆页面: 或者显示一个出错信息: 作为一个快捷方式, 你可以使用便捷的 login_required

  • 在PHP中编码,我尝试初始化Spotify API,不使用重定向uri,只使用client_id和client_secret。我尝试下面的代码:从响应url中提取令牌-Spotify API,但我得到一个NULL结果 我想知道我是否可以在不要求用户登录的情况下访问令牌(参见https://developer.spotify.com/web-api/authorization-guide/#auth

  • 我想使用谷歌的REST API访问公共日历。 Google的日历API建议我需要OAuth令牌才能访问日历: https://developers.google.com/google-apps/calendar/auth 然而,我正在访问一个公共日历,并且正在服务器上执行此操作,因此不能/不应该要求用户进行身份验证。 我使用node.jsapi: 这将返回“您的客户端发出了一个格式错误或非法的请求

  • 感谢您提供的任何指示/示例。