Android/iOS:如何使用 SAML 协议通过 Azure AD 为移动设备提供 SSO
Posted
技术标签:
【中文标题】Android/iOS:如何使用 SAML 协议通过 Azure AD 为移动设备提供 SSO【英文标题】:Android/iOS: How to provide SSO for mobile devices with Azure AD using SAML protocol 【发布时间】:2019-08-13 10:22:10 【问题描述】:我正在尝试使用 SAML 2.0 协议在带有 Azure AD 的移动本机设备中实现 SSO。从网络上我可以成功登录,但我没有找到使用移动客户端做同样事情的方法。我尝试使用 Microsoft Azure here 提供的 android 项目。我能够使用这个项目获得令牌。但我不明白接下来需要做什么。我们之前的请求是这样的(没有 Azure): https://myssodomain.com/adfs/ls/?SAMLRequest=SomeCodehere。对此请求的调用用于给我一个 SAMLResponse,我在重定向 URL 中使用它,作为回报,它用于向我提供用户配置文件详细信息。现在,与 Azure 中的机制完全不同,我不明白在收到访问令牌后应该如何进行。我应该如何调用上述 URL 以获取 SAMLResponse 代码,以便我可以使用从服务提供商获取用户配置文件。
【问题讨论】:
【参考方案1】:下面的协议图描述了单点登录序列。云服务(服务提供者)使用 HTTP 重定向绑定将 AuthnRequest(身份验证请求)元素传递给 Azure AD(身份提供者)。然后,Azure AD 使用 HTTP 发布绑定将 Response 元素发布到云服务。
要请求用户身份验证,云服务会向 Azure AD 发送一个 AuthnRequest 元素。示例 SAML 2.0 AuthnRequest 可能类似于以下示例:
<samlp:AuthnRequest
xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
ID="id6c1c178c166d486687be4aaf5e482730"
Version="2.0" IssueInstant="2013-03-18T03:28:54.1839884Z"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
</samlp:AuthnRequest>
当请求的登录成功完成时,Azure AD 会向云服务发布响应。对成功登录尝试的响应类似于以下示例:
<samlp:Response ID="_a4958bfd-e107-4e67-b06d-0d85ade2e76a" Version="2.0" IssueInstant="2013-03-18T07:38:15.144Z" Destination="https://contoso.com/identity/inboundsso.aspx" InResponseTo="id758d0ef385634593a77bdf7e632984b6" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> https://login.microsoftonline.com/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
...
</ds:Signature>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
</samlp:Status>
<Assertion ID="_bf9c623d-cc20-407a-9a59-c2d0aee84d12" IssueInstant="2013-03-18T07:38:15.144Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<Issuer>https://login.microsoftonline.com/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
...
</ds:Signature>
<Subject>
<NameID>Uz2Pqz1X7pxe4XLWxV9KJQ+n59d573SepSAkuYKSde8=</NameID>
<SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<SubjectConfirmationData InResponseTo="id758d0ef385634593a77bdf7e632984b6" NotOnOrAfter="2013-03-18T07:43:15.144Z" Recipient="https://contoso.com/identity/inboundsso.aspx" />
</SubjectConfirmation>
</Subject>
<Conditions NotBefore="2013-03-18T07:38:15.128Z" NotOnOrAfter="2013-03-18T08:48:15.128Z">
<AudienceRestriction>
<Audience>https://www.contoso.com</Audience>
</AudienceRestriction>
</Conditions>
<AttributeStatement>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
<AttributeValue>testuser@contoso.com</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
<AttributeValue>3F2504E0-4F89-11D3-9A0C-0305E82C3301</AttributeValue>
</Attribute>
...
</AttributeStatement>
<AuthnStatement AuthnInstant="2013-03-18T07:33:56.000Z" SessionIndex="_bf9c623d-cc20-407a-9a59-c2d0aee84d12">
<AuthnContext>
<AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
</AuthnContext>
</AuthnStatement>
</Assertion>
</samlp:Response>
Response 元素包含授权请求的结果。 Azure AD 在 Response 元素中设置 ID、Version 和 IssueInstant 值。它还设置了以下属性:
• 目的地:登录成功完成后,将其设置为服务提供商(云服务)的 RedirectUri。
• InResponseTo:设置为发起响应的 AuthnRequest 元素的 ID 属性。
有关更多文档,您可以参考以下主题
https://docs.microsoft.com/en-us/azure/active-directory/develop/single-sign-on-saml-protocol https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-saml-protocol-reference
SAML 协议要求身份提供者 (Azure AD) 和服务提供者(应用程序)交换有关他们自己的信息。
// 执行认证请求 mAuthContext.acquireToken( 获取活动(), RESOURCE_ID, 客户 ID, REDIRECT_URI, PromptBehavior.Auto, getAuthInteractiveCallback());
// ...
// 获取令牌以调用 Microsoft Graph 等 API mAuthResult.getAccessToken()
一旦你有了token,你就可以用它来调用graph api。
这里有一个 wiki 用于在 android 中设置 SSO,您可能会感兴趣。
https://github.com/AzureAD/azure-activedirectory-library-for-android/wiki
希望对你有帮助。
【讨论】:
以上是关于Android/iOS:如何使用 SAML 协议通过 Azure AD 为移动设备提供 SSO的主要内容,如果未能解决你的问题,请参考以下文章