Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Si no existe, se crea un principal de servicio para la aplicación cliente. Una entidad de servicio es la instancia de una aplicación o un servicio en el tenant de Microsoft Entra. El acceso concedido a la aplicación o servicio está asociado a este objeto de principal de servicio.
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.
Al usuario se le asigna la aplicación cliente. La asignación de la aplicación al usuario garantiza que la aplicación aparece en el portal Aplicaciones para ese usuario. El usuario puede revisar y revocar el acceso concedido en su nombre desde el portal de Aplicaciones.
Requisitos previos
Una cuenta de usuario con el rol de Administrador de Roles con Privilegios, Administrador de Aplicaciones o Administrador de Aplicaciones en la Nube.
Los siguientes detalles del centro de administración de Microsoft Entra:
- Identificador de la aplicación para la aplicación a la que va a conceder el consentimiento. Para los fines de este artículo, lo llamamos la aplicación cliente.
- Los permisos de API que la aplicación cliente necesita. Descubra el 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.
Otorgamiento de consentimiento en nombre de un solo usuario
En el ejemplo de este artículo se usa Microsoft Graph PowerShell para conceder consentimiento en nombre de un único usuario. La aplicación cliente es Microsoft Graph Explorer y se concede acceso a la API de Microsoft Graph.
Para conceder consentimiento a una aplicación en nombre de un usuario mediante Microsoft Graph PowerShell, debe iniciar sesión como mínimo un Administrador de aplicaciones en la nube.
# The app for which consent is being granted.
$clientAppId = "de8bc8b5-d9f9-48b1-a8ad-b748da725064" # Your client application
# The API to which access will be granted. Your client application 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 = "[email protected]"
# 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 que usa la API de Microsoft Graph, inicie sesión en Microsoft Graph Explorer como mínimo un administrador de aplicaciones de Cloud.
Debe 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 del identificador de objeto
aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb. - Microsoft Graph define los permisos delegados,
User.Read.AllyGroup.Read.All. - ConsentType es
Principal, que indica que está aceptando en nombre de un solo usuario del inquilino. - El id. de objeto de la aplicación empresarial cliente es
aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb. - El identificador principal 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.
Recupere todos los permisos delegados que Microsoft Graph (la aplicación de recursos) define en la aplicación de inquilino. Identifique los permisos delegados que quiere conceder a la aplicación cliente. En este ejemplo, los permisos de delegación son
User.Read.AllyGroup.Read.All.GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopesPara 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" }Confirme que ha concedido 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'Asigne la aplicación al usuario. Esta asignación garantiza que el usuario pueda iniciar sesión si se requiere la asignación. También garantiza que la aplicación esté disponible a través del portal de 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 (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" }