Eliminar consentimientos en las aplicaciones de Azure Active Directory

Si estás probando diferentes scopes para tus aplicaciones integradas con Azure Active Directory, es posible que notes que cuando estás jugando con los mismos usuarios, los cuales ya han dado su consentimiento, a veces tengas comportamientos extraños (Si no sabes lo que son los consentimientos, o los scopes, echa un vistazo a este artículo). Por ejemplo, cuando disminuyes el número de scopes puedes comprobar que si el usuario consintió más (u otros) en algún momento, el servidor de autorización te devuelve todos aquellos que una vez permitió. En este artículo te muestro cómo eliminar consentimientos pasados.

Ejemplo de prueba

Para verlo con un ejemplo, puedes usar el código de este artículo. Inicia sesión con uno de tus usuarios de prueba, acepta los tres scopes (user.read calendars.read contacts.read), y comprobarás que el token devuelto tiene los tres, como es de esperar:

Si vas a la sección Enterprise applications de Azure AD, y accedes a tu aplicación, en el apartado Permissions podrás ver en una pestaña llamada User consent, donde están todos los scopes que han sido permitidos. Además, si quieres saber quiénes han sido los usuarios puedes verlo a través de los enlaces de la columna GRANTED BY.

Ahora reduce el scope a solo dos, en el archivo .env (y reinicia la aplicación):

SCOPE="user.read contacts.read"

Si vuelves a iniciar sesión, con alguno de los usuarios que ya habían consentido, comprobarás que te devuelve todos los scopes, aunque pidas menos y los hayas eliminado de API Permissions (en este caso calendars.read). Esto te puede volver bastante loco/a.

La solución

Para solucionarlo, debes eliminar los consentimientos que tienes en tu aplicación a través del siguiente PowerShell:

#Install Azure AD module
Install-Module AzureAD
#Connect to your Azure Active Directory
Connect-AzureAD
# Get Service Principal using objectId
$sp = Get-AzureADServicePrincipal -ObjectId "<YOUR_OBJECT_ID>"
# Get all delegated permissions for the service principal
$spOAuth2PermissionsGrants = Get-AzureADOAuth2PermissionGrant -All $true| Where-Object { $_.clientId -eq $sp.ObjectId }
# Remove all delegated permissions
$spOAuth2PermissionsGrants | ForEach-Object {
    Remove-AzureADOAuth2PermissionGrant -ObjectId $_.ObjectId
}

Lo que hacemos es instalar el módulo de AzureAD y nos conectamos a nuestro tenant. Recuperamos el service principal de nuestra aplicación (el object id puedes encontrarlo en el apartado Properties de tu aplicación en Azure Active Directory) y lo usamos para recuperar todos los permisos delegados que tenemos consentidos y después eliminamos todos ellos a través de un foreach. Si ahora refrescas la sección donde veías los consentimientos verás que la lista está vacía. Vuelve a probar el acceso con cualquiera de tus usuarios y comprobarás que vuelve a pedir la aprobación, pero esta vez solo con los scopes que tienes configurados. Ahora todo tiene sentido de nuevo 🙂

Si quisieras eliminar además los permisos que se han aceptado del tipo aplicación puedes utilizar estos comandos:

# Get all application permissions for the service principal
$spApplicationPermissions = Get-AzureADServiceAppRoleAssignedTo -ObjectId $sp.ObjectId -All $true | Where-Object { $_.PrincipalType -eq "ServicePrincipal" }
# Remove all delegated permissions
$spApplicationPermissions | ForEach-Object {
    Remove-AzureADServiceAppRoleAssignment -ObjectId $_.PrincipalId -AppRoleAssignmentId $_.objectId
}

¡Saludos!