Как прочитать элемент NameID в качестве заявки в техническом профиле B2C для провайдера идентификации SAML2? - PullRequest
0 голосов
/ 05 октября 2018

Я следовал примеру в Настройка входа с провайдером Salesforce SAML с помощью настраиваемых политик в Azure Active Directory B2C и смогла успешно выполнить единый вход из Salesforce в Azure B2C.Однако я также хотел бы получить значение элемента NameID из утверждения SAML в качестве утверждения.Возможно ли это?

Например, предположим, что входящее подтверждение SAML 2.0, опубликованное на конечной точке потребителя подтверждения B2C, выглядит примерно так: упрощенный XML.

<saml:Assertion>
    <saml:Issuer>https://mytestinstance-dev-ed.my.salesforce.com</saml:Issuer>
    <saml:Subject>
        <saml:NameID>emp99999</saml:NameID>
    </saml:Subject>
    <saml:AuthnStatement AuthnInstant="2018-10-04T16:56:44.192Z">
        <saml:AuthnContext>
            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
        </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
        <saml:Attribute Name="userId">
            <saml:AttributeValue>009f90000099zzz</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="username">
            <saml:AttributeValue>user000@example.com</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="email">
            <saml:AttributeValue>user000@example.com</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="">
            <saml:AttributeValue>false</saml:AttributeValue>
        </saml:Attribute>
    </saml:AttributeStatement>
</saml:Assertion>

TechnicalProfile позволяет получить доступ к любому атрибуту изАтрибут AttributeStatement как заявка путем ссылки на его Имя в PartnerClaimType в элементе OutputClaim.Например, для указанного ниже Технического профиля заявка socialIdpUserId установлена ​​в значение атрибута userId из утверждения SAML "009f90000099zzz".То, что я хотел бы иметь, это утверждение с именем employeeId, которое установлено в «emp99999», значение элемента NameID.

<TechnicalProfile Id="salesforce">
    <DisplayName>Salesforce</DisplayName>
    <Description>Login with your Salesforce account</Description>
    <Protocol Name="SAML2"/>
    <Metadata>
        <Item Key="RequestsSigned">false</Item>
        <Item Key="WantsEncryptedAssertions">false</Item>
        <Item Key="WantsSignedAssertions">false</Item>
        <Item Key="PartnerEntity">https://mytestinstance-dev-ed.my.salesforce.com/.well-known/samlidp/TestB2C.xml</Item>
    </Metadata>
    <!-- <CryptographicKeys>  -->
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="userId"/>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email"/>
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="username"/>
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication"/>
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="SAMLIdp" />
        <!-- We want the Subject/NameID value as a custom employeeId claim. URI reference doesn't work. -->
        <OutputClaim ClaimTypeReferenceId="employeeId" 
            PartnerClaimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" />
    </OutputClaims>
    <!--<OutputClaimsTransformations> -->
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>
</TechnicalProfile>

Я пытался использовать значения PartnerClaimType, такие как «NameID», «NameIdentifier»,а также хорошо известный URI для NameIdentifier и ни один из них, похоже, не работал.

Я также видел некоторые ссылки на использование элемента SubjectNamingInfo и экспериментировал с ним, но это имеет значение только при определении токена, отправляемого RelyingParty , а не при чтении утверждений из токенаПолучено от IDP.

А как насчет других элементов Assertion?Например, в зависимости от того, как его использует IDP, может возникнуть необходимость прочитать значение AuthnContextClassRef, чтобы принять решение о необходимости вызова MFA.

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Решение использовать assertionSubjectName определенно правильно.Фактически, MSFT 20 декабря 2018 года обновил свою главную страницу документации, добавив дополнительную информацию: Определение технического профиля SAML .Это сказанное - я хотел добавить еще одну заметку, которая может помочь другим, кто сталкивается с этим поведением.Похоже, что Azure НЕ будет сопоставлять NameID с вашей заявкой на выход, если элемент NameID имеет атрибут «NameQualifier».

Пример - это сопоставит с вашей выходной заявкой:

 <Subject>
            <NameID>foo@bar.com</NameID>

Это НЕ сопоставит с вашей выходной заявкой:

<Subject>
    <NameID NameQualifier="https://bar.com/realms/foo">foo@bar.com</NameID>

Надеюсь, это будет полезно всемкто столкнулся с ситуацией, когда «assertionSubjectName» не работает.Это сказанное - кажется, что это поведение не все, что желательно, и я обратился к MSFT, чтобы узнать, является ли это WAD или нет.

0 голосов
/ 03 апреля 2019

В моем случае я пытался извлечь NameID из ответа SAML, где элемент NameID имел атрибут SPNameQualifier.Использование assertionSubjectName не работало.

Однако, что работало, так это использование значения атрибута SPNameQualifier .

Например, предположим, что ваш ответ SAML выглядит как

<saml:Subject>
  <saml:NameID SPNameQualifier="https://bar.com/realms/foo">emp99999</saml:NameID>
</saml:Subject>

Чтобы извлечь значение NameID, вы можете установить сопоставление вашей заявки как

<OutputClaims>
  <!-- Other claims -->
  <OutputClaim ClaimTypeReferenceId="employeeId" PartnerClaimType="https://bar.com/realms/foo" />
</OutputClaims>
0 голосов
/ 07 ноября 2018

Для протокола SAML2 доступ к значению элемента NameID можно получить с помощью PartnerClaimType со значением "assertionSubjectName" .Это упоминается в разделе «Указание технического профиля для провайдера утверждений SAML 2.0» в Компонентах части 6 в репозитории Advanced Policies Git.

Например, для сопоставления NameID изПодтверждение SAML в утверждении «employeeId», установите его PartnerClaimType в «assertionSubjectName» в элементе утверждения OutputClaim.

<OutputClaims>
    <!-- Other claims -->
    <OutputClaim ClaimTypeReferenceId="employeeId" 
        PartnerClaimType="assertionSubjectName" />
</OutputClaims>

Другой пример можно найти в Указание технического профиля для выдержки из SAML 2 из документации.docx .

Редактировать

Согласно ответу Адама С, теперь это задокументировано в Определите технический профиль SAML в пользовательской политике Azure Active Directory B2C .Он также отмечает, что B2C не будет сопоставлять NameID с вашей выходной заявкой, если элемент NameID имеет атрибут «NameQualifier».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...