La creación de actividades personalizadas en Forefront Identity Manager (ahora Microsoft Identity Manager) requería conocimientos de programación en C# o VB.Net y de cómo funciona Windows Workflow Foundation.
Microsoft ha lanzado recientemente la MIMWAL (MIM Workflow Activity Library) que permite hacer muchas de las cosas que podría hacer una actividad personalizada sin necesidad de saber programar un lenguaje .Net.
Es una herramienta estupenda, pero hay que aprender a utilizarla. He tenido la suerte de trabajar recientemente en un proyecto con el autor de MIMWAL y he pensado en compartir algunas situaciones comunes para ayudar a la gente a familiarizarse con su uso.
Leer un recurso
Al crear flujos de trabajo personalizados, una de las primeras cosas que hay que hacer es leer un recurso. Para hacer esto en MIMWAL se utiliza la actividad "Actualizar recursos". Esta actividad se utiliza mucho en los proyectos MIMWAL, ya que te permite leer recursos y añadir valores a los datos del flujo de trabajo que luego se pueden utilizar para actualizar un recurso.
En la actividad de actualización de recursos a continuación, la parte "Queries" de la actividad está configurando el XPath para consultar el objeto de ubicación llamado "Default". Y poniendo esa consulta XPath en la clave "DefaultLocation".
Luego, en la sección "Actualizaciones", ese XPath se utiliza a través de [//Queries/DefaultLocation] para poner el valor de la ejecución de la consulta XPath en la variable $DefaultLocation. $DefaultLocation es entonces establecida (en la segunda línea) para ser el valor de [//WorkflowData/DefaultLocation]. Esto permite que el valor sea utilizado en actividades posteriores en el flujo de trabajo llamando a [//WorkflowData/DefaultLocation].
El gráfico anterior también muestra que se puede establecer una variable dándole directamente un valor de cadena.
"@dominio.com" será el valor almacenado en [//WorkflowData/SMTPDomain].
Otra forma de establecer atributos es utilizar un filtro XPath en la sección "Actualizaciones" en la "Expresión de valor".
Por ejemplo:
IIF([IsPresent([//Objetivo/Lugar]),[//Objetivo/Lugar], "Por defecto") )
Devuelve el valor del atributo Location del destino si está presente, si no devuelve la cadena "Default".
Búsquedas efectivas y delta
Hay dos funciones de búsqueda útiles que utilicé en un flujo de trabajo para validar si un código de país estaba presente en un usuario. El atributo de código de país era nuevo para dar cabida a un requisito de que un código de país estuviera presente si el valor de teléfono estaba presente. Sin embargo, muchos usuarios ya tenían un atributo de teléfono. El flujo de trabajo de autorización debía gestionar estas situaciones:
- El usuario con un atributo de teléfono existente añade un código de país.
- El usuario introduce un nuevo atributo de teléfono (o modifica uno existente) y el código de país.
- El usuario introduce un atributo de teléfono (o modifica uno existente) y ningún código de país.
- El usuario elimina un atributo del teléfono.
La búsqueda Delta proporcionará el valor del atributo que se encuentra en el parámetro de solicitud.
La búsqueda efectiva funciona en los flujos de trabajo de AuthZ para devolver el valor que tendría el atributo después de que se confirme la solicitud (este sería el mismo valor que Delta si el atributo se cambia durante esta solicitud, de lo contrario será el valor actual en el Destino).
Por lo tanto, la primera etapa del flujo de trabajo AuthZ es utilizar una actividad de actualización de recursos para establecer algunas variables:
Las Expresiones de valor están estableciendo valores booleanos para saber si hay datos en el Delta (lo que hay en la solicitud), el Objetivo (lo que hay actualmente en el usuario) y Efectivo (cuál será el código de país después de que se procese la solicitud).
Adicionalmente, estamos verificando si hay un valor de Teléfono de Oficina después de que la solicitud ha sido procesada. Usamos esto en el siguiente paso: Verificar Solicitud en la Condición de Ejecución de la Actividad.
Aquí está la solicitud de verificación:
La Condición de Ejecución de la Actividad comprueba que el atributo teléfono tendrá un valor después de que se envíe la solicitud (el valor Efectivo). Si no tendrá un valor, la solicitud de verificación pasa. Si lo tendrá, entonces se verifican las Condiciones Requeridas de la Solicitud.
Esta es la Condición de Ejecución de la Actividad:
ConvertToBoolean([//WorkflowData/EffectiveOfficePhone])
Se utilizarán las condiciones de solicitud requeridas para determinar si los datos son válidos. Si la condición falla, se devuelve el mensaje del "Mensaje de denegación" y se deniega el acceso.
Las condiciones de solicitud anteriores comprueban en primer lugar que el código del país delta o el código del país de destino estén presentes. Si es así, la solicitud es válida para esa condición:
Or(Eq([//WorkflowData/CódigoPaísDelta],True),Eq([//WorkflowData/CódigoPaísDestino],True)
La siguiente comprobación de validez es que el código de país efectivo esté presente o que el teléfono de la oficina no esté presente (porque si el teléfono se está borrando, el código de país no es necesario).
Or(Eq([//WorkflowData/EffectiveCountryCode],True),Eq([//WorkflowData/EffectiveOfficePhone],False)
Si se superan ambas comprobaciones, la autorización pasa. Si alguna de ellas falla, la solicitud se deniega y el valor del mensaje "Acceso denegado" que se devuelve es el valor de la primera solicitud que falló.
MIMWAL es una herramienta muy práctica que facilita y agiliza la creación de flujos de trabajo complejos. Estoy deseando utilizarlo en futuros proyectos.