Per Attribute Consent für vom SP nicht 'required' Attribute
In den allgemeinen Properties (conf/idp.properties
) des IdP kann man einen per Attrbute Consent einstellen (idp.consent.allowPerAttribute = true
). D.h. der Nutzer kann für jedes Attribut, das nicht explizit von SP über die Metadaten angefordert wird (mit dem Tag required=„True“
versehen), über eine Checkbox entscheiden, ob der Wert an den SP übertragen wird oder nicht.
In der Default-Konfiguration des IdP werden mit dieser Einstellung auf der Attribute-Release Seite die required-Attribute nicht angezeigt. Folgende Anpassungen sind für eine Anzeige der required-Attribute vorzunehmen:
- Ergänzung in der Datei
views/intercept/attribute-release.vm
... #set ($requestClass = $attributeReleaseContext.getClass().forName("jakarta.servlet.http.HttpServletRequest")) #set ($isAttributeRequired = $attributeReleaseContext.getClass().forName("net.shibboleth.idp.consent.logic.impl.IsAttributeRequiredPredicate").getDeclaredConstructor($requestClass).newInstance($request)) ...
- Im Velocity Template die Checkbox für non-required Attribute anzeigen. Required Attribute werden ohne Checkbox angezeigt. Dazu wird in der Datei
views/intercept/attribute-release.vm
folgende if-Anweisung ersetzt:
... #foreach ($attribute in $attributeReleaseContext.getConsentableAttributes().values()) #if ($attributeReleaseFlowDescriptor.perAttributeConsentEnabled) <fieldset> <input id="$attribute.id" type="checkbox" name="_shib_idp_consentIds" value="$encoder.encodeForHTML($attribute.id)" checked> <label for="$attribute.id">$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))</label> #else <p>$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))</p> <input id="$attribute.id" type="hidden" name="_shib_idp_consentIds" value="$encoder.encodeForHTML($attribute.id)"> #end ...
- durch:
... #foreach ($attribute in $attributeReleaseContext.getConsentableAttributes().values()) #if ($attributeReleaseFlowDescriptor.perAttributeConsentEnabled) <fieldset> #if ($isAttributeRequired.test($attribute)) <input id="$attribute.id" type="hidden" name="_shib_idp_consentIds" value="$encoder.encodeForHTML($attribute.id)"> #else <input id="$attribute.id" type="checkbox" name="_shib_idp_consentIds" value="$encoder.encodeForHTML($attribute.id)" checked> #end <label for="$attribute.id">$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))</label> #else <p>$encoder.encodeForHTML($attributeDisplayNameFunction.apply($attribute))</p> <input id="$attribute.id" type="hidden" name="_shib_idp_consentIds" value="$encoder.encodeForHTML($attribute.id)"> #end ...
Wird der AttributeQuery benutzt, muss auch hier der letzte Consent vom Nutzer beachtet werden. Dazu ist in conf/intercept/consent-intercept-config.xml
für die Bean shibboleth.consent.AttributeQuery.Condition
der parent Parameter auf den Wert shibboleth.Conditions.TRUE
zu setzen, siehe hierzu unter Server-Side-Storage, Sessions, User Consent und Persistent Identifier. Damit werden auch AttributeQueries gegen die zuletzt gespeicherte Nutzereinwilligung gefiltert. Hat der Nutzer nur einmal zugestimmt, werden keine Attribute übertragen.
Für das Propagieren des zusätzlichen Objektes in den Attribute-Release-Flow ist leider ein Neustart des IdP nötig.