Интеграция CAS и Shibboleth, выпускающая главное имя (имя пользователя) в качестве атрибута в SAML

Мне кажется, что я искал везде, где должна быть простая конфигурация: и нашел пустой.

Я совершенно новичок в Shibboleth, хотя я немного работал с CAS, ничего особенного. Я его настроил (следуя руководству по адресу: https://wiki.jasig.org/display/CASUM/Shibboleth-CAS+Integration), чтобы Shibboleth перенаправлял на CAS для аутентификации. Это работает нормально, и как только пользователь аутентифицируется, он перенаправляется через Shibboleth и отправляется ответ SAML. Я тестирую с помощью https://sp.testshib.org, и он правильно получает ответ и отображает страницу.

Чего я не могу понять, так это того, как выпустить простой атрибут с именем пользователя, используемым для входа в CAS. Я знаю, что Shibboleth видит это (из idp-process.log), но я не могу понять, что добавить в attribute-resolver.xml и attribute-filter.xml, чтобы выпустить это.

Текущий ответ SAML выглядит так:

<?xml version="1.0" encoding="UTF-8"?><saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_da56752846e00c2693ece2c486d7c870" IssueInstant="2012-11-16T14:08:07.570Z" Version="2.0">
   <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://<idpurl>/idp/shibboleth</saml2:Issuer>
   <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
         <ds:Reference URI="#_da56752846e00c2693ece2c486d7c870">
            <ds:Transforms>
               <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
               <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>7OHKEiEQ0ZcPDcnt4B8PIGoLEfw=</ds:DigestValue>
         </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>S3FZI+KpNf8wUYWMA96ccAj0Y5ebojB1xKHlixHWNEr4voqHOGSpBzxdui0IVtUwLEzj4RrDFdYarJaZj6ltzFV4hfNx5bN88zYQG6w9BBP9UybG+81Wrhii2O31AmRz2Y6XIqa72CeN2R4DKo70awn6FXIPLAcEKs+7dAG2lQ87VS3Wv126DghE/eGcMLW6+z9a3MxXtUFSmWYosaIbNREJn4mGO/uGzD27eeo6SNmvBx/BgVh7T2cOIbtD8b9OOZT8Urt0kZ2nsoCZHgp1T0V6ZgnE2TDvPTInrxzC5c4S+YOYZlB0ijMI6pk+PpJGshe7MVUcEO34Nn0I3i0OUw==</ds:SignatureValue>
      <ds:KeyInfo>
         <ds:X509Data>
            <ds:X509Certificate><!--Valid Certificate--></ds:X509Certificate>
         </ds:X509Data>
      </ds:KeyInfo>
   </ds:Signature>
   <saml2:Subject>
      <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" NameQualifier="https://<idpurl>/idp/shibboleth" SPNameQualifier="https://sp.testshib.org/shibboleth-sp">_4b1a2780b2ce3db36ea7e7f6192b7108</saml2:NameID>
      <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
         <saml2:SubjectConfirmationData Address="<valid ip address>" InResponseTo="_aa4e23dd783eddb1be18ad224c26e7cf" NotOnOrAfter="2012-11-16T14:13:07.570Z" Recipient="https://sp.testshib.org/Shibboleth.sso/SAML2/POST"/>
      </saml2:SubjectConfirmation>
   </saml2:Subject>
   <saml2:Conditions NotBefore="2012-11-16T14:08:07.570Z" NotOnOrAfter="2012-11-16T14:13:07.570Z">
      <saml2:AudienceRestriction>
         <saml2:Audience>https://sp.testshib.org/shibboleth-sp</saml2:Audience>
      </saml2:AudienceRestriction>
   </saml2:Conditions>
   <saml2:AuthnStatement AuthnInstant="2012-11-16T14:08:07.554Z" SessionIndex="00568a153d3cccf9c17abf2c77a043ed8b74a74fe5e2c61000590269aa87f99a">
      <saml2:SubjectLocality Address="<valid ip address>"/>
      <saml2:AuthnContext>
         <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
      </saml2:AuthnContext>
   </saml2:AuthnStatement>
</saml2:Assertion> 

Мне просто нужен пример того, как это настроить. Я прочитал всю документацию на wiki.shibboleth.net и до сих пор не могу ее понять.

Заранее большое спасибо за вашу помощь, я знаю, что это всего лишь конфигурация, но из-за этого мой мозг кажется тупым, и я даже не пробовал интегрироваться с чем-то более интенсивным, чем TestShib!

РЕДАКТИРОВАТЬ: Я нашел это руководство по настройке, которое частично помогает, я смог передать имя в качестве атрибута, выполнив поиск по активному каталогу, но это не подходящее долгосрочное решение, поскольку CAS может проверять более одного пользовательского репозитория , и это не обязательно тот, который будет проверяться, чтобы получить его. Я просто хочу выпустить $ {requestContext.principalName} как атрибут.

Есть идеи получше? Может быть, статический соединитель, но я не уверен, как заставить его разрешить $ {requestContext.principalName}?


person CDerrig    schedule 16.11.2012    source источник
comment
Вы хотите освободить имя пользователя в теге NameID или в атрибуте?   -  person performanceuser    schedule 16.11.2012
comment
В качестве атрибута предпочтительно существует несколько SP, которые в конечном итоге должны будут обслуживаться этой системой IDP, и у меня еще нет формата ответа для каждого из них (все еще на стадии исследования, чтобы увидеть, будет ли это маршрут, по которому мы пойдем ), поэтому, если они принимают SAML 2.0, то этот атрибут, вероятно, будет проще всего приспособить.   -  person CDerrig    schedule 17.11.2012


Ответы (1)


В конце концов я смог это понять. Публикация решения здесь для всех, кто когда-либо сталкивался с этим и терялся в болоте деталей, которые должны быть простыми.

В файле attribute-resolver.xml для Shibboleth мне пришлось добавить следующий преобразователь:

<resolver:AttributeDefinition id="principal" xsi:type="PrincipalName" xmlns="urn:mace:shibboleth:2.0:resolver:ad">

    <resolver:AttributeEncoder
        xsi:type="SAML1String"
        xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
        name="urn:mace:dir:attribute-def:principal" />

    <resolver:AttributeEncoder
        xsi:type="SAML2String"
        xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
        name="urn:oid:1.3.6.1.4.1.5923.1.1.1.1"
        friendlyName="principal" />

</resolver:AttributeDefinition>

В attribute-filter.xml мне нужно было добавить следующий фильтр:

    <AttributeFilterPolicy id="releaseBasicAttributesToAnyone">
        <PolicyRequirementRule xsi:type="basic:ANY"/>
        <AttributeRule attributeID="principal">
                <PermitValueRule xsi:type="basic:ANY" />
        </AttributeRule>
    </AttributeFilterPolicy>

Измените свое правило требований к политике, если вы не хотите предоставлять принципала каждому SP.

Удивительно, что что-то настолько простое, кажется, нигде четко не задокументировано. Я просмотрел документы shibboleth намного дольше, чем следовало, и наконец нашел подсказку в сообщении групп Google, которое кто-то сделал о желании изменить значение PrincipalName.

Надеюсь, это поможет кому-то другому!

person CDerrig    schedule 23.11.2012
comment
@CDerrig, как вы могли получить главное имя, не имея коннектора данных в attribute-resolver.xml? - person M.S.Naidu; 17.12.2014