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的主要内容,如果未能解决你的问题,请参考以下文章

.Net 4.5 标准中的 SAML 2.0 协议支持

单一登录 (SAML 协议)

SAML简介

SAML和OAuth2这两种SSO协议的区别

比较SSO协议: WS-Fed, SAML, and OAuth

基于Saml协议的Moodle单点登录的配置与实现