admin管理员组

文章数量:1549466

博客地址:http://blog.csdn/FoxDave

上一篇我们介绍了发起Microsoft Graph请求的核心:访问令牌。本篇我们探讨一下在使用Microsoft Graph进行查询时可能遇到的多种认证场景。

OAuth 2.0 flows

Microsoft标识平台实现了一些OAuth 2.0规格书中定义的认证场景。

授权代码

授权代码流很可能是最常用的获取访问令牌的流。该流分为两个部分:认证/授权部分和令牌请求。

首先,用户信息被发送到Azure AD登录页。在web应用中,这是一个简单的跳转。在本地应用程序中,这包含了打开访问Azure AD网站的浏览器对话框。URL包含了标识发起请求的应用程序和请求的权限scopes的参数。如果用户是第一次使用应用程序(或者请求的权限级别跟上次用户使用应用程序时不同),所请求权限的列表会展示给用户,让用户进行查看并决定是否批准这些权限。
如果用户批准了请求的权限,浏览器会带着授权码一起跳转回应用程序。之后应用程序就可以把这个授权码和应用程序密钥发送POST请求到Microsoft标识平台令牌终结点去获取访问令牌了。

权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌会带有一个用户上下文。

什么时候使用授权代码
如果应用程序:

  • 是服务端Web应用程序或本地/移动端允许用户交互的应用程序
  • 需要以用户身份访问Microsoft Graph

使用授权代码是最佳选择。

隐式授权

隐式授权流的启动方式跟授权代码流一样,通过将用户跳转到Azure AD登录页。然而,这种流不返回授权码,而是返回访问令牌。

这种简化流用来支持用JavaScript实现的单页应用程序 (SPA)。由于这些应用程序完全地在用户的浏览器中运行,很可能是没有后台组件的,所以如果要进行授权代码流就会有如下困难:

  • 在客户端JavaScript代码中存储不被发现的应用程序密钥是不可行的。
  • 大多数认证服务器 (包括Microsoft标识平台)不支持CORS请求。

这种流通过消除应用程序密钥并且不涉及POST请求来解决这些问题。

权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌会带有一个用户上下文。

什么时候使用隐式授权
如果应用程序是客户端JavaScript单页应用程序并且没有后台组件,使用隐式授权流是最佳选择。

客户端凭据流

客户端凭据流不同于前面的两种流,体现在两个主要方面。首先,该流不需要任何用户交互,因此对于服务或无人值守进程应用程序是最好的选择。第二,该流使用应用程序权限,而不是托管权限。

尽管该流自身不需要用户交互,但需要组织的管理员对应用程序所需的权限进行批准。这是一个可以发生在应用程序注册时的一次性过程,或者我们可以构建一个最小的Web应用程序来让管理员去对应用程序进行认证和授权。

管理员对应用程序进行授权之后,应用程序就可以通过提供它的应用程序ID和密钥来获取访问令牌,或通过在应用程序注册时跟Azure AD共享的证书对请求令牌进行签名。

权限的类型
使用这种流的应用程序利用应用程序权限。从该流返回的访问令牌不会带有用户上下文,是对组织内的所有用户进行授权的。

什么时候使用客户端凭据
如果应用程序需要组织内的所有用户访问,不需要实现UI或运行在非用户交互的场景下(如服务、计划任务等),使用客户端凭据流是最佳选择。

代理流

代理流用于中间层服务场景。它通常包含一个使用授权代码或隐式授权的用户应用程序和一个受Azure AD OAuth保护的用于访问Microsoft Graph的Web API或服务。

在该流中,用户登录到前端的应用程序,获取一个向中间层服务授权的访问令牌。然后中间层服务使用该访问令牌来获取另一个访问令牌代理用户访问Microsoft Graph。

该流不同于正常的授权代码流,因为前端应用程序本身无法访问Microsoft Graph。

权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌总是带有用户上下文。

什么时候使用代理
如果应用程序包含多个组件,包括前端用户应用程序和后端的Web API或服务,使用代理流是最佳选择。

刷新访问令牌流

Microsoft标识平台发布的访问令牌的生命周期是短暂的,一个小时之后过期。应用程序可以在用户不取消应用程序授权的情况下,请求新的访问令牌而不需要用户重新授权。做这个的方式取决于应用程序使用的流的类型。

  • 使用授权代码流或代理流的应用程序可以请求offline_access范围去获取一个新的访问令牌。应用程序使用刷新访问令牌发起POST请求到Azure AD的访问令牌终结点来获取一个新的访问令牌。
  • 使用隐式授权流的应用程序不具有刷新访问令牌。然而,应用程序运行在用户的浏览器中,会话是被保持的。应用程序可以使用隐藏的iframe默默地请求一个新的访问令牌。
  • 使用客户端凭据流的应用程序同样不具有刷新访问令牌。由于在该流中请求访问令牌不需要用户交互,应用程序只需要以获取初始访问令牌的方式去使用POST请求获取新的访问令牌即可。

练习

读者可以通过浏览器或者Postman尝试授权代码流。

  1. 注册V2版本的Azure AD应用程序,确保redirect URI处填写为https://localhost:8080
  2. 打开Postman创建一个新的POST请求到https://login.microsoftonline/YOUR_TENANT_ID/oauth2/v2.0/token,将YOUR_TENANT_ID替换为自己创建的应用程序的实际的租户ID。
  3. 配置如下图内容。
  4. 打开浏览器访问https://login.microsoftonline/YOUR_TENANT_ID/oauth2/v2.0/authorize?client_id=YOUR_APP_ID&response_type=code&redirect_uri=https%3A%2F%2Flocalhost%3A8080&response_mode=query&scope=openid%20profile%20offline_access%20User.Read,同样将YOUR_TENANT_ID和YOUR_APP_ID进行替换。
  5. 登录并对应用程序进行授权,浏览器会跳转回https://localhost:8080/并显示一个网站无法访问的错误。
  6. 复制浏览器地址栏中的URL,它应该形如https://localhost:8080/?code=IAQABAAIAAAC…&session_state=…。复制code参数值的所有内容,它就是Microsoft标识平台返回的授权代码。
  7. 将授权代码粘贴到Postman请求中的code参数部分,然后发送请求。
  8. 返回的响应JSON中会包含访问令牌、刷新令牌和ID令牌,如下图。

本文标签: 场景GraphMicrosoftoffice