Внешняя регистрация IdP в WSO2: управление несколькими AttributeConsumingService - PullRequest
0 голосов
/ 28 октября 2019

Я использую WSO2 Identity Server версии 5.8.0 и 5.9.0. Я столкнулся с этой проблемой: у меня есть внешние IdP, и я хочу разрешить интеграцию SAML с этими IdP. Я могу зарегистрировать их в WSO2, и все работает довольно хорошо.

Вопрос связан с AttributeConsumingService Во внешнем IdP я зарегистрировал эти WSO2 ServiceMetadata:

<?xml version="1.0" encoding="UTF-8"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_3574ad74-ba7a-4ea5-b3e8-dbb2dafb55df" entityID="http://wso2_590_ai">
   <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
      <md:KeyDescriptor use="signing">
         <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:X509Data>
               <ds:X509Certificate><!--Certificate info--></ds:X509Certificate>
            </ds:X509Data>
         </ds:KeyInfo>
      </md:KeyDescriptor>
      <md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://localhost:9443/samlsso" />
      <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
      <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://localhost:9443/commonauth" index="0" isDefault="true" />
      <md:AttributeConsumingService index="0">
         <md:ServiceName xml:lang="it">set0</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field A" Name="fielda" />
         <md:RequestedAttribute FriendlyName="Field B" Name="fieldb" />
      </md:AttributeConsumingService>
      <md:AttributeConsumingService index="1">
         <md:ServiceName xml:lang="it">set1</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field A" Name="fielda" />
         <md:RequestedAttribute FriendlyName="Field B" Name="fieldb" />
         <md:RequestedAttribute FriendlyName="Field C" Name="fieldc" />
         <md:RequestedAttribute FriendlyName="Field D" Name="fieldd" />
      </md:AttributeConsumingService>
      <md:AttributeConsumingService index="2">
         <md:ServiceName xml:lang="it">set2</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field A" Name="fielda" />
         <md:RequestedAttribute FriendlyName="Field C" Name="fieldc" />
      </md:AttributeConsumingService>
      <md:AttributeConsumingService index="3">
         <md:ServiceName xml:lang="it">set3</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field A" Name="fielda" />
         <md:RequestedAttribute FriendlyName="Field D" Name="fieldd" />
      </md:AttributeConsumingService>
      <md:AttributeConsumingService index="4">
         <md:ServiceName xml:lang="it">set4</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field B" Name="fieldb" />
         <md:RequestedAttribute FriendlyName="Field D" Name="fieldd" />
      </md:AttributeConsumingService>
      <md:AttributeConsumingService index="5">
         <md:ServiceName xml:lang="it">set5</md:ServiceName>
         <md:RequestedAttribute FriendlyName="Field B" Name="fieldb" />
         <md:RequestedAttribute FriendlyName="Field C" Name="fieldc" />
      </md:AttributeConsumingService>
   </md:SPSSODescriptor>
   <md:Organization>
      <md:OrganizationName xml:lang="it">Service provider WSO2 590</md:OrganizationName>
      <md:OrganizationDisplayName xml:lang="it">WSO2 590</md:OrganizationDisplayName>
      <md:OrganizationURL xml:lang="it">https://localhost:9443/</md:OrganizationURL>
   </md:Organization>
</md:EntityDescriptor>

Как вы можете видетьв моих метаданных я могу обработать несколько AttributeConsumingService. Как я могу сказать WSO2, что ServiceProvider хочет использовать AttributeConsumingService number 1, другой AttributeConsumingService number 2 и т. Д.

Единственная точка, где я могу установить AttributeConsumingService, - это во время регистрации внешнего IdP, но это немногостранно, потому что я должен несколько раз зарегистрировать один и тот же IdP с проблемами, связанными с entityId ...

Спасибо

Анджело

1 Ответ

0 голосов
/ 28 октября 2019

Я думаю, что смог решить эту проблему.

Я изменил метод org.wso2.carbon.identity.application.authenticator.samlsso.manager.DefaultSAML2SSOManager.buildAuthnRequest(HttpServletRequest, boolean, String, AuthenticationContext). Сразу после инструкции

//Get the inbound SAMLRequest
AuthnRequest inboundAuthnRequest = getAuthnRequest(context);

я добавил следующий фрагмент кода:

Integer attrConsServiceIndex = inboundAuthnRequest.getAttributeConsumingServiceIndex();
if( attrConsServiceIndex != null && attrConsServiceIndex > 0 ) {
   if( log.isInfoEnabled() ) {
log.info("Inbound SAML Request AttributeConsumingServiceIndex "+ attrConsServiceIndex+" Settato nella auth request SAML");
    }
authRequest.setAttributeConsumingServiceIndex(attrConsServiceIndex);
}

Таким образом, если приложение, обрабатываемое поставщиком услуг, отправляет AttributeConsumingServiceIndex, отличный от 0, этоустановите в AuthnRequest, что WSO2 IS строит для внешнего IdP. Я не знаю, есть ли другой способ ее решения, но насколько я исследовал, это единственное решение, которое я нашел

Надеюсь, это полезно

Angelo

...