不同SP的多个属性-resolver.xml
Multiple attribute-resolver.xml for different SPs
我有不同的 SP 使用我的 IDP Shibboleth,但对于每个 SP,我想在 SAML 响应中发送不同的属性。
有办法实现吗?
也许使用不同的属性解析器文件,或者可能使用相同的文件,但在 AttributeDefinition
上进行一些配置,我可以设置这些配置,以便 shibboleth 知道要解析哪些值?
我在他们的 wiki 上没有找到任何关于此的内容。
我建议您查看 attribute mapping 的主题。有了这个,您可以在您的服务提供商上定义过滤器。收集 IDP 上所有 SP 所需的所有属性,然后过滤服务提供商所需的属性。
示例:SP 1 需要名为 email_1
的属性,SP 2 需要 email_2
。
那么你的 attribute-resolver.xml
可能看起来像这样:
<AttributeDefinition xsi:type="Simple" id="email_1">
<InputDataConnector ref="myDB" attributeNames="email_1"/>
<AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid"/>
<AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.3" friendlyName="email_1" encodeType="false"/>
</AttributeDefinition>
<AttributeDefinition xsi:type="Simple" id="email_2">
<InputDataConnector ref="myDB" attributeNames="email_2"/>
<AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid2"/>
<AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.4" friendlyName="email_2" encodeType="false"/>
</AttributeDefinition>
<DataConnector id="myDB" xsi:type="RelationalDatabase">
<SimpleManagedConnection jdbcDriver="com.mysql.jdbc.Driver"
jdbcURL="jdbc:mysql://localhost:3306/login"
jdbcUserName="bla"
jdbcPassword="blabla"/>
<QueryTemplate>
<![CDATA[
SELECT
mail_1,
mail_2
FROM login
WHERE
mail_1 = '$resolutionContext.principal'
]]>
</QueryTemplate>
<Column columnName="mail_1" attributeID="mail_1"/>
<Column columnName="mail_2" attributeID="mail_2"/>
</DataConnector>
然后,在 attribute-map.xml
中的服务提供商 1 上,您只过滤掉您需要的属性:
<Attribute name="urn:oid:0.9.2342.19200300.100.1.3" id="mail_1" />
<Attribute name="urn:mace:dir:attribute-def:uid" id="mail_1" />
因此,当 SP1 同时收到 mail_1
和 mail_2
属性时,mail_2
将被拒绝,因为它不在您的 attribute-map.xml
文件中。
我有不同的 SP 使用我的 IDP Shibboleth,但对于每个 SP,我想在 SAML 响应中发送不同的属性。
有办法实现吗?
也许使用不同的属性解析器文件,或者可能使用相同的文件,但在 AttributeDefinition
上进行一些配置,我可以设置这些配置,以便 shibboleth 知道要解析哪些值?
我在他们的 wiki 上没有找到任何关于此的内容。
我建议您查看 attribute mapping 的主题。有了这个,您可以在您的服务提供商上定义过滤器。收集 IDP 上所有 SP 所需的所有属性,然后过滤服务提供商所需的属性。
示例:SP 1 需要名为 email_1
的属性,SP 2 需要 email_2
。
那么你的 attribute-resolver.xml
可能看起来像这样:
<AttributeDefinition xsi:type="Simple" id="email_1">
<InputDataConnector ref="myDB" attributeNames="email_1"/>
<AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid"/>
<AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.3" friendlyName="email_1" encodeType="false"/>
</AttributeDefinition>
<AttributeDefinition xsi:type="Simple" id="email_2">
<InputDataConnector ref="myDB" attributeNames="email_2"/>
<AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid2"/>
<AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.4" friendlyName="email_2" encodeType="false"/>
</AttributeDefinition>
<DataConnector id="myDB" xsi:type="RelationalDatabase">
<SimpleManagedConnection jdbcDriver="com.mysql.jdbc.Driver"
jdbcURL="jdbc:mysql://localhost:3306/login"
jdbcUserName="bla"
jdbcPassword="blabla"/>
<QueryTemplate>
<![CDATA[
SELECT
mail_1,
mail_2
FROM login
WHERE
mail_1 = '$resolutionContext.principal'
]]>
</QueryTemplate>
<Column columnName="mail_1" attributeID="mail_1"/>
<Column columnName="mail_2" attributeID="mail_2"/>
</DataConnector>
然后,在 attribute-map.xml
中的服务提供商 1 上,您只过滤掉您需要的属性:
<Attribute name="urn:oid:0.9.2342.19200300.100.1.3" id="mail_1" />
<Attribute name="urn:mace:dir:attribute-def:uid" id="mail_1" />
因此,当 SP1 同时收到 mail_1
和 mail_2
属性时,mail_2
将被拒绝,因为它不在您的 attribute-map.xml
文件中。