Udzielanie zgody w imieniu pojedynczego użytkownika przy użyciu programu PowerShell
Z tego artykułu dowiesz się, jak udzielić zgody w imieniu pojedynczego użytkownika przy użyciu programu PowerShell.
Gdy użytkownik udziela zgody dla siebie, częściej występują następujące zdarzenia:
Zostanie utworzona jednostka usługi dla aplikacji klienckiej, jeśli jeszcze nie istnieje. Jednostka usługi to wystąpienie aplikacji lub usługi w dzierżawie firmy Microsoft Entra. Dostęp udzielony aplikacji lub usługi jest skojarzony z tym obiektem jednostki usługi.
Dla każdego interfejsu API, do którego aplikacja wymaga dostępu, delegowane uprawnienie do tego interfejsu API jest tworzone dla uprawnień wymaganych przez aplikację. Dostęp jest udzielany w imieniu użytkownika. Delegowane uprawnienie autoryzuje aplikację do uzyskiwania dostępu do interfejsu API w imieniu użytkownika, gdy ten użytkownik się zaloguje.
Użytkownik jest przypisany do aplikacji klienckiej. Przypisanie aplikacji do użytkownika gwarantuje, że aplikacja znajduje się na liście w portalu Moje aplikacje dla tego użytkownika. Użytkownik może przejrzeć i odwołać dostęp udzielony w ich imieniu z portalu Moje aplikacje.
Wymagania wstępne
Aby udzielić zgody aplikacji w imieniu jednego użytkownika, potrzebne są następujące elementy:
- Konto użytkownika z administratorem ról uprzywilejowanych, administratorem aplikacji lub administratorem aplikacji w chmurze
Udzielanie zgody w imieniu pojedynczego użytkownika
Przed rozpoczęciem zapisz następujące szczegóły w centrum administracyjnym firmy Microsoft Entra:
- Identyfikator aplikacji dla aplikacji, której udzielasz zgody. Na potrzeby tego artykułu nazywamy ją aplikacją kliencą.
- Uprawnienia interfejsu API wymagane przez aplikację klienckę. Znajdź identyfikator aplikacji interfejsu API oraz identyfikatory uprawnień lub wartości oświadczeń.
- Nazwa użytkownika lub identyfikator obiektu dla użytkownika, któremu udzielono dostępu w imieniu.
W tym przykładzie używamy programu Microsoft Graph PowerShell do udzielania zgody w imieniu pojedynczego użytkownika. Aplikacja kliencka to Microsoft Graph Explorer i udzielamy dostępu do interfejsu API programu Microsoft Graph.
Aby udzielić zgody aplikacji w imieniu jednego użytkownika przy użyciu programu Microsoft Graph PowerShell, musisz zalogować się jako co najmniej administrator aplikacji w chmurze.
# 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"
}
Aby udzielić zgody aplikacji w imieniu jednego użytkownika przy użyciu interfejsu API programu Microsoft Graph, zaloguj się do Eksploratora programu Graph jako co najmniej administrator aplikacji w chmurze.
Musisz wyrazić zgodę na następujące uprawnienia:
Application.ReadWrite.All
, , Directory.ReadWrite.All
DelegatedPermissionGrant.ReadWrite.All
.
W poniższym przykładzie przyznasz delegowane uprawnienia zdefiniowane przez interfejs API zasobów do aplikacji dla przedsiębiorstw klienta w imieniu pojedynczego użytkownika.
W tym przykładzie aplikacja przedsiębiorstwa zasobów to Microsoft Graph identyfikator aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
obiektu . Program Microsoft Graph definiuje delegowane uprawnienia User.Read.All
i Group.Read.All
. Wartość consentType to Principal
, wskazująca, że wyrażasz zgodę w imieniu pojedynczego użytkownika w dzierżawie. Identyfikator obiektu aplikacji dla przedsiębiorstw klienta to aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
. PrincipalId użytkownika to aaaaaaaa-bbbb-cccc-1111-222222222222
.
Uwaga
Ostrożnie! Uprawnienia przyznane programowo nie podlegają przeglądowi ani potwierdzeniu. Natychmiast wejdą one w życie.
Pobierz wszystkie delegowane uprawnienia zdefiniowane przez program Microsoft Graph (aplikacja zasobów) w aplikacji dzierżawy. Zidentyfikuj delegowane uprawnienia, które chcesz przyznać aplikacji klienckiej. W tym przykładzie uprawnienia delegowania to
User.Read.All
iGroup.Read.All
GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes
Przyznaj delegowane uprawnienia aplikacji dla przedsiębiorstw klienta w imieniu użytkownika, uruchamiając następujące żądanie.
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" }
Upewnij się, że udzielono użytkownikowi zgody, uruchamiając następujące żądanie.
GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq '00001111-aaaa-2222-bbbb-3333cccc4444' and consentType eq 'Principal'
Przypisz aplikację do użytkownika. To przypisanie gwarantuje, że użytkownik może zalogować się, jeśli jest wymagane przypisanie, i gwarantuje, że aplikacja jest dostępna za pośrednictwem portalu Moje aplikacje użytkownika. W poniższym przykładzie reprezentuje aplikację kliencją,
resourceId
do której jest przypisany użytkownik. Użytkownik ma przypisaną domyślną rolę aplikacji, która to00000000-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" }