La API de biblioteca de SAML puede utilizarse para crear una señal SAML con un NameID personalizado.
Acerca de esta tarea
Cuando se crean señales SAML autoemitidas utilizando el generador de señales SAML, no hay forma de personalizar el NameID utilizando
propiedades de manejador de devolución de llamada. Sin embargo, utilizando la API de biblioteca SAML, puede crearse un manejador de devolución de llamada
de NameID SAML personalizado que se define en el archivo SAMLIssuerConfig.properties y que puede personalizar el NameID de una señal SAML
autoemitida. Un manejador de devolución de llamada NameID de SAML también puede ser utilizado por aplicaciones que utilizan el método newSAMLToken.
El manejador de devolución de llamada NameID de SAML se ejecutará para todas las señales SAML que se han creado desde el servidor de aplicaciones con el
archivo SAMLIssuerConfig.properties modificado.
Procedimiento
- Desarrolle un manejador de devolución de llamada NameID de SAML personalizado. Por ejemplo:
package test.saml;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import com.ibm.websphere.wssecurity.callbackhandler.NameIDCallback;
import com.ibm.wsspi.wssecurity.saml.data.SAMLNameID;
public class NameIDProvider implements javax.security.auth.callback.CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
if (callbacks == null || callbacks.length == 0) {
throw new UnsupportedCallbackException(null, "No hay ninguna devolución de llamada.");
}
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameIDCallback) {
NameIDCallback callback = (NameIDCallback)callbacks[i];
SAMLNameID nameid = new SAMLNameID("newNameID", null, null, null, null);
callback.setSAMLNameID(nameid);
}
}
}
}
- Añada la propiedad personalizada NameIDProvider al archivo (cellRoot)/sts/SAMLIssuerConfig.properties. Por ejemplo:
NameIDProvider =test.saml.NameIDProvider
Resultados
Cuando esta tarea se haya completado utilizando el código de ejemplo proporcionado, el elemento siguiente se añadirá a todas las señales SAML:
<saml:Subject>
<saml:NameID>newNameID</saml:NameID>
</saml:Subject>