要在使用 Active Directory 联合身份验证服务 (AD FS) 颁发的 SAML 令牌并且还需要访问 Microsoft Graph 的应用程序中启用单一登录 (SSO),请按照本文中的步骤操作。
你将启用 SAML 持有者断言流,以便将联合 AD FS 实例颁发的 SAMLv1 令牌换成 Microsoft Graph 的 OAuth 2.0 访问令牌。 将用户的浏览器重定向到 Microsoft Entra ID 以便对用户进行身份验证时,浏览器将从 SAML 登录中拾取会话,而不会要求用户输入其凭据。
重要
仅当 AD FS 是颁发原始 SAMLv1 令牌的联合标识提供者时,此方案才有效。 不能将 Microsoft Entra ID 颁发的 SAMLv2 令牌交换成 Microsoft Graph 访问令牌。
先决条件
- AD FS 作为单一登录的联合标识提供者;有关示例,请参阅设置 AD FS 并启用 Office 365 的单一登录。
- 发出 HTTP 请求的 REST 客户端。
场景概述
当客户端需要使用现有的信任关系时,你可以通过 OAuth 2.0 SAML 持有者断言流使用 SAML 断言请求 OAuth 访问令牌。 应用于 SAML 断言的签名提供已授权应用的身份验证。 SAML 断言是标识提供者颁发的 XML 安全令牌,由服务提供者使用。 出于安全相关的目的,该服务提供者依赖于其内容来识别断言的使用者。
SAML 断言将发布到 OAuth 令牌终结点。 该终结点根据应用的先前审批状态处理断言并颁发访问令牌。 客户端不需要具有或存储刷新令牌,也不需要将客户端密码传递给令牌终结点。
使用 Microsoft Entra ID 注册应用程序
要使用 Microsoft Entra ID 注册应用程序,请遵循使用 Microsoft 标识平台注册应用程序中的步骤。
从 ADFS 获取 SAML 断言
使用 SOAP 信封创建发送给 AD FS 终结点的 POST 请求,以提取 SAML 断言:
POST https://ADFSFQDN/adfs/services/trust/2005/usernamemixed
参数值:
密钥 | 价值 |
---|---|
client-request-id | CLIENT_ID |
标头值:
密钥 | 价值 |
---|---|
SOAPAction | http://schema.xlmsoap.org/ws/2005/02/trust/RST/Issue |
内容类型 | application/soap+xml |
client-request-id | CLIENT_ID |
return-client-request-id | 是 |
接受 | application/json |
AD FS 请求正文:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
<a:MessageID>urn:uuid:9af3303f-1f9e-466c-9938-c9a982822557</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:UsernameToken u:Id="uuid-2525825F-6A4A-44D8-83BA-68E26F4DD99">
<o:Username>USERNAME</o:Username>
<o:Password>PASSWORD</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust="http://schemas.xmlsoap.org/ws/2005/02/trust">
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<a:EndpointReference>
<a:Address>urn:federation:partner.microsoftonline.cn</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</trust:KeyType>
<trust:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</trust:RequestType>
<trust:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</trust:TokenType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>
成功发布此请求后,应会收到来自 AD FS 的 SAML 断言。 只需提供 SAML:Assertion 标记数据,请将其转换为 base64 编码,以便在后续请求中使用。
使用 SAML 断言获取 OAuth 2.0 令牌
使用 AD FS 断言响应提取 OAuth 2.0 令牌。
创建包含标头值的 POST 请求:
密钥 | 值 | 说明 |
---|---|---|
主机 | login.partner.microsoftonline.cn | |
内容类型 (Content-Type) | application/x-www-form-urlencoded |
在请求正文中,替换 client_id、client_secret 和 assertion(在上一步骤中获取的 base64 编码 SAML 断言):
密钥 | 值 | 说明 |
---|---|---|
授权类型 (grant_type) | urn:ietf:params:oauth:grant-type:saml2-bearer | 指定授权的类型 |
客户端ID | CLIENTID | 应用程序的客户端 ID |
客户端密钥 | CLIENTSECRET(客户密钥) | 应用程序的客户端密码 |
断言 | ASSERTION | base64 编码的 SAML 断言 |
范围 | openid https://microsoftgraph.chinacloudapi.cn/.default |
令牌的有效范围 |
请求成功后,你将收到来自 Microsoft Entra ID 的访问令牌。
使用 OAuth 2.0 令牌获取数据
收到访问令牌后,调用图形 API(在此示例中为 Outlook 任务)。
使用上一步骤中提取的访问令牌创建 GET 请求:
密钥 | 值 | 说明 |
---|---|---|
Content-Type | application/x-www-form-urlencoded | |
授权 | 持有者 ACCESS_TOKEN | 从 OAuth 2.0 令牌请求获取的访问令牌 |
成功发出请求后,将收到 JSON 响应。
后续步骤
有关应用注册和身份验证流的详细信息,请参阅: