Как получить данные из SAML Response с помощью XSL Transformation? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь включить службу единого входа SAML на нашем программном обеспечении предприятия, используя Azure AD в качестве поставщика удостоверений (с этого момента IdP). Продолжайте получать HTTP ОШИБКУ: 500 Ошибка доступа ... / myhost / client / SAML2 / POST. Причина:

Cannot create authentication master data from: ...
<root>
  <party isgroup="0" isactive="1" isvisible="1" issystem="0" auth_extern="2" auth_standard="0" sync_extern="0" login="[NameID]" count_invalid_logins="0" display_name="[USER DISPLAY NAME]" name="[USER_LAST_NAME]" firstname="USER_FIRST_NAME" locale="[LANG_CODE]" email="[USER_EMAIL]" main_role="[ROLE]" main_domain="[CENSHARE_DOMAIN]" main_domain2="[CENSHARE_2ND_DOMAIN]" expiry_date="2019-11-29T19:38:55.528Z">
    <party_role role="userrole" domain="[CENSHARE_DOMAIN]" domain2="[CENSHARE_2ND_DOMAIN]" enabled="1"/>
  </party>
</root>

Поскольку я получаю ответ от своего IdP, кажется, что я неправильно отображаю данные. Это беспокоило меня уже несколько дней, и я не могу найти решение. SAML Ответ от AAD:

<Assertion ID="_787xe00" IssueInstant="2019-10-30T19:50:32.912Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
  <Issuer>
    https://sts.windows.net/178x117/
  </Issuer>
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
      <Reference URI="#_7877x7e00">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <DigestValue>
          Sx7lGM=
        </DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>
   ca1+K4aeUV07UJsA9TjChAaj6rKAsYU92ZsRWrlwvbeMpGXptyQBXfUJII1azvqNgtv4Cdqom+hZhdblablaCDmQ==
    </SignatureValue>
    <KeyInfo>
      <X509Data>
        <X509Certificate>
          blablaP9dHmv+Mzhe9i5wjs
        </X509Certificate>
      </X509Data>
    </KeyInfo>
  </Signature>
  <Subject>
    <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
      boxx@xxxx.at //DATA THAT I WANT TO CATCH FOR STARTERS
    </NameID>
    <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
      <SubjectConfirmationData InResponseTo="_46e00b1831xbb0a43a" NotOnOrAfter="2019-10-30T19:55:32.912Z" Recipient="https://myhost/client/SAML2/POST"/>
    </SubjectConfirmation>
  </Subject>
  <Conditions NotBefore="2019-10-30T19:45:32.896Z" NotOnOrAfter="2019-10-30T20:50:32.896Z">
    <AudienceRestriction>
      <Audience>
        https://myhost/client/client
      </Audience>
    </AudienceRestriction>
  </Conditions>
  <AttributeStatement>
    <Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid">
      <AttributeValue>
        1784x931fe8117
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
      <AttributeValue>
        3e33xaf0
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.microsoft.com/identity/claims/displayname">
      <AttributeValue>
        Borislav
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.microsoft.com/identity/claims/identityprovider">
      <AttributeValue>
        https://sts.windows.net/1784xfe8117/
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.microsoft.com/claims/authnmethodsreferences">
      <AttributeValue>
        http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname">
      <AttributeValue>
        Borislav
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname">
      <AttributeValue>
        M
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
      <AttributeValue>
        borisxxxx@xxxxxx.at
      </AttributeValue>
    </Attribute>
    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
      <AttributeValue>
        borisxxxxx@xxxxx.at
      </AttributeValue>
    </Attribute>
  </AttributeStatement>
  <AuthnStatement AuthnInstant="2019-10-30T16:29:23.770Z" SessionIndex="_7877x00">
    <AuthnContext>
      <AuthnContextClassRef>
        urn:oasis:names:tc:SAML:2.0:ac:classes:Password
      </AuthnContextClassRef>
    </AuthnContext>
  </AuthnStatement>
</Assertion>

И это мое XSL-преобразование

<xsl:stylesheet version="2.0"                 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 
                xmlns:xs="http://www.w3.org/2001/XMLSchema"                 
                xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"                 
                exclude-result-prefixes="#all" >   
 <xsl:template match="saml:Assertion">
         //**** Do i need some params here to fetch the data? ****     
  <root>       
   <party isgroup="0" 
          isactive="1" 
          isvisible="1" 
          issystem="0"              
          auth_extern="2" 
          auth_standard="0" 
          sync_extern="0"              
          login="[USER NAMEID]" ---!!!!-- think that this is problematic
          count_invalid_logins="0"              
          display_name="[USER DISPLAY NAME]" 
          name="[USER_LAST_NAME]"
          firstname="USER_FIRST_NAME" 
          locale="[LANG_CODE]"
          email="[USER_EMAIL]"               
          main_role="[ROLE]" 
          main_domain="[OUR_DOMAIN]" main_domain2="[OUR_2ND_DOMAIN]">         
     <xsl:attribute name="expiry_date"                        
                    select="xs:dateTime(current-dateTime()) 
                            + xs:dayTimeDuration('P30D')"/>         
     <party_role role="userrole" 
                 domain="[OUR_DOMAIN]" 
                 domain2="[OUR_2ND_DOMAIN]" 
                 enabled="1"/>       
    </party>     
  </root>      
 </xsl:template>  
</xsl:stylesheet>

Что я делаю не так? Я изменил данные по понятным причинам :) Заранее спасибо.

1 Ответ

0 голосов
/ 08 ноября 2019

Поскольку я не получил ответа, я сделал все возможное, чтобы выяснить сам:)

Ответ довольно прост: во фрагменте сразу после совпадения шаблона нам нужно добавить переменные в соответствии с нашими потребностями,получить данные с помощью выражения XPath и затем использовать те же переменные вниз при преобразовании. Пример:

<xsl:variable name="user-name-id" select="saml:Subject/saml:NameID"/>

и затем вызываем его, как и любую другую переменную:

login="{$user-name-id}" 

Нам просто нужно следовать пути структуры XML из нашего утверждения SAML.

...