Android / iOS: как обеспечить единый вход для мобильных устройств с помощью Azure AD по протоколу SAML - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь внедрить единый вход в мобильные устройства с помощью Azure AD, используя протокол SAML 2.0. Из Интернета я могу успешно войти, но я не нахожу способ сделать то же самое с помощью мобильного клиента. Я пытался использовать проект Android, предоставленный Microsoft Azure здесь . Я смог получить токен с помощью этого проекта. Но я не понимаю, что нужно делать дальше. Наш предыдущий запрос был примерно таким (без Azure): https://myssodomain.com/adfs/ls/?SAMLRequest=SomeCodehere. Вызов на этот запрос используется для предоставления мне SAMLResponse, который я использовал в URL перенаправления, а взамен он использовал для предоставления мне данных профиля пользователя. Теперь, так как в Azure механизм совершенно другой, я не понимаю, как мне действовать после получения токена доступа. Как мне позвонить по указанному выше URL, чтобы получить код SAMLResponse, чтобы я мог использовать его для получения профиля пользователя у поставщика услуг.

1 Ответ

0 голосов
/ 26 марта 2019

Схема протокола ниже описывает последовательность единого входа. Облачная служба (поставщик услуг) использует привязку HTTP Redirect для передачи элемента AuthnRequest (запрос аутентификации) в Azure AD (поставщик удостоверений). Затем Azure AD использует HTTP-привязку публикации для публикации элемента Response в облачной службе.

enter image description here

Чтобы запросить аутентификацию пользователя, облачные службы отправляют элемент AuthnRequest в Azure AD. Пример 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 устанавливает значения идентификатора, версии и IssueInstant в элементе Response. Он также устанавливает следующие атрибуты:

• Назначение: при успешном завершении входа в систему устанавливается значение RedirectUri поставщика услуг (облачная служба).

• InResponseTo: для него устанавливается атрибут ID элемента AuthnRequest, инициировавшего ответ.

Для дальнейшей документации, вы можете обратиться к темам ниже

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 ( getActivity (), RESOURCE_ID, ID КЛИЕНТА, Redirect_uri
PromptBehavior.Auto, getAuthInteractiveCallback ());

// ...

// Получить токены для вызова таких API, как Microsoft Graph mAuthResult.getAccessToken ()

Получив токен, вы можете использовать его для вызова Graph API.

Здесь у нас есть вики для настройки единого входа в Android, вас это может заинтересовать.

https://github.com/AzureAD/azure-activedirectory-library-for-android/wiki

Надеюсь, это поможет.

...