Compartir a través de


Otorgamiento de consentimiento en nombre de un solo usuario mediante PowerShell

En este artículo, aprenderá a otorgar consentimiento en nombre de un único usuario mediante PowerShell.

Cuando un usuario concede consentimiento en nombre propio, los siguientes eventos se producen con mayor frecuencia:

  1. Se crea una entidad de servicio para la aplicación cliente, si aún no existe. Una entidad de servicio es la instancia de una aplicación o un servicio, en el inquilino de Microsoft Entra. El acceso concedido a la aplicación o servicio está asociado a este objeto de entidad de servicio.

  2. Para cada API a la que la aplicación necesite acceder, se crea una concesión de permisos delegados a esa API para los permisos que necesita la aplicación. El acceso se concede en nombre del usuario. Una concesión de permisos delegados autoriza a una aplicación a acceder a una API en nombre de un usuario, cuando ese usuario inicia sesión.

  3. Al usuario se le asigna la aplicación cliente. La asignación de la aplicación al usuario garantiza que la aplicación aparezca en el portal Mis aplicaciones de ese usuario. El usuario puede revisar y revocar el acceso concedido en su nombre desde su portal Mis aplicaciones.

Requisitos previos

Para otorgar consentimiento a una aplicación en nombre de un usuario, necesita:

  • Una cuenta de usuario con un permiso de Administrador de roles con privilegios, Administrador de aplicaciones o Administrador de aplicaciones en la nube

Antes de empezar, registre los detalles siguientes en el Centro de administración de Microsoft Entra:

  • El id. de la aplicación para la aplicación a la que va a otorgar consentimiento. A los efectos de este artículo, se denomina aplicación cliente.
  • Los permisos de API que la aplicación cliente necesita. Disponga del id. de la aplicación de la API y los id. de permiso o los valores de notificación.
  • El nombre de usuario o el id. de objeto del usuario en nombre del que se concede el acceso.

En este ejemplo, se usa PowerShell de Microsoft Graph para otorgar consentimiento en nombre de un solo usuario. La aplicación cliente es Microsoft Graph Explorer y se concederá acceso a Microsoft Graph API.

Para conceder consentimiento a una aplicación en nombre de un usuario mediante PowerShell de Microsoft Graph, debe iniciar sesión al menos como un administrador de aplicaciones en la nube.

# The app for which consent is being granted. In this example, we're granting access
# to Microsoft Graph Explorer, an application published by Microsoft.
$clientAppId = "de8bc8b5-d9f9-48b1-a8ad-b748da725064" # Microsoft Graph Explorer

# The API to which access will be granted. Microsoft Graph Explorer makes API 
# requests to the Microsoft Graph API, so we'll use that here.
$resourceAppId = "00000003-0000-0000-c000-000000000000" # Microsoft Graph API

# The permissions to grant. Here we're including "openid", "profile", "User.Read"
# and "offline_access" (for basic sign-in), as well as "User.ReadBasic.All" (for 
# reading other users' basic profile).
$permissions = @("openid", "profile", "offline_access", "User.Read", "User.ReadBasic.All")

# The user on behalf of whom access will be granted. The app will be able to access 
# the API on behalf of this user.
$userUpnOrId = "user@example.com"

# Step 0. Connect to Microsoft Graph PowerShell. We need User.ReadBasic.All to get
#    users' IDs, Application.ReadWrite.All to list and create service principals, 
#    DelegatedPermissionGrant.ReadWrite.All to create delegated permission grants, 
#    and AppRoleAssignment.ReadWrite.All to assign an app role.
#    WARNING: These are high-privilege permissions!
Connect-MgGraph -Scopes ("User.ReadBasic.All Application.ReadWrite.All " `
                        + "DelegatedPermissionGrant.ReadWrite.All " `
                        + "AppRoleAssignment.ReadWrite.All")

# Step 1. Check if a service principal exists for the client application. 
#     If one doesn't exist, create it.
$clientSp = Get-MgServicePrincipal -Filter "appId eq '$($clientAppId)'"
if (-not $clientSp) {
   $clientSp = New-MgServicePrincipal -AppId $clientAppId
}

# Step 2. Create a delegated permission that grants the client app access to the
#     API, on behalf of the user. (This example assumes that an existing delegated 
#     permission grant does not already exist, in which case it would be necessary 
#     to update the existing grant, rather than create a new one.)
$user = Get-MgUser -UserId $userUpnOrId
$resourceSp = Get-MgServicePrincipal -Filter "appId eq '$($resourceAppId)'"
$scopeToGrant = $permissions -join " "
$grant = New-MgOauth2PermissionGrant -ResourceId $resourceSp.Id `
                                     -Scope $scopeToGrant `
                                     -ClientId $clientSp.Id `
                                     -ConsentType "Principal" `
                                     -PrincipalId $user.Id

# Step 3. Assign the app to the user. This ensures that the user can sign in if assignment
#     is required, and ensures that the app shows up under the user's My Apps portal.
if ($clientSp.AppRoles | ? { $_.AllowedMemberTypes -contains "User" }) {
    Write-Warning ("A default app role assignment cannot be created because the " `
                 + "client application exposes user-assignable app roles. You must " `
                 + "assign the user a specific app role for the app to be listed " `
                 + "in the user's My Apps portal.")
} else {
    # The app role ID 00000000-0000-0000-0000-000000000000 is the default app role
    # indicating that the app is assigned to the user, but not for any specific 
    # app role.
    $assignment = New-MgServicePrincipalAppRoleAssignedTo `
          -ServicePrincipalId $clientSp.Id `
          -ResourceId $clientSp.Id `
          -PrincipalId $user.Id `
          -AppRoleId "00000000-0000-0000-0000-000000000000"
}

Para conceder consentimiento a una aplicación en nombre de un usuario mediante Microsoft Graph API, inicie sesión en Graph Explorer al menos como administrador de aplicaciones en la nube.

Tiene que dar su consentimiento a los siguientes permisos:

Application.ReadWrite.All, Directory.ReadWrite.All, DelegatedPermissionGrant.ReadWrite.All.

En el ejemplo siguiente, se conceden permisos delegados definidos por una API de recursos a una aplicación empresarial cliente en nombre de un solo usuario.

En el ejemplo, la aplicación empresarial de recursos es Microsoft Graph de id. de objeto aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb. Microsoft Graph define los permisos delegados User.Read.All y Group.Read.All. El valor de consentType es Principal, lo que indica que está consintiendo en nombre de todos los usuarios del inquilino. El id. de objeto de la aplicación empresarial cliente es aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb. El valor principalId del usuario es aaaaaaaa-bbbb-cccc-1111-222222222222.

Precaución

Por lo tanto, tenga cuidado. Los permisos concedidos mediante programación no están sujetos a revisión o confirmación. Surten efecto inmediatamente.

  1. Recupere todos los permisos delegados definidos por Microsoft Graph (la aplicación de recursos) en la aplicación del inquilino. Identifique los permisos delegados que quiere conceder a la aplicación cliente. En este ejemplo, los permisos delegados son User.Read.All y Group.Read.All.

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes
    
  2. Para conceder los permisos delegados a la aplicación empresarial cliente en nombre del usuario, ejecute la siguiente solicitud.

    POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants
    
    Request body
    {
       "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
       "consentType": "Principal",
       "resourceId": "a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
       "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
       "scope": "User.Read.All Group.Read.All"
    }
    
  3. Para confirmar que ha concedido el consentimiento al usuario mediante la ejecución de la siguiente solicitud.

    GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq '00001111-aaaa-2222-bbbb-3333cccc4444' and consentType eq 'Principal'
    
  4. Asigne la aplicación al usuario. Esta asignación garantiza que el usuario pueda iniciar sesión si la asignación es obligatoria y que la aplicación esté disponible desde el portal Mis aplicaciones del usuario. En el ejemplo siguiente, resourceIdrepresenta la aplicación cliente a la que se asigna el usuario. Al usuario se le asigna el rol de aplicación predeterminado, que es 00000000-0000-0000-0000-000000000000.

        POST /servicePrincipals/resource-servicePrincipal-id/appRoleAssignedTo
    
        {
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "resourceId": "a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
        "appRoleId": "00000000-0000-0000-0000-000000000000"
        }
    

Pasos siguientes