Sdílet prostřednictvím


Udělení souhlasu jménem jednoho uživatele pomocí PowerShellu

V tomto článku se dozvíte, jak udělit souhlas jménem jednoho uživatele pomocí PowerShellu.

Když uživatel udělí souhlas sám sobě, dochází častěji k následujícím událostem:

  1. Instanční objekt pro klientskou aplikaci se vytvoří, pokud ještě neexistuje. Instanční objekt je instance aplikace nebo služby ve vašem tenantovi Microsoft Entra. Přístup udělený aplikaci nebo službě je přidružený k tomuto instančnímu objektu.

  2. Pro každé rozhraní API, ke kterému aplikace vyžaduje přístup, se pro oprávnění, která aplikace potřebuje, vytvoří delegovaná oprávnění. Přístup je udělen jménem uživatele. Delegovaná oprávnění udělují aplikaci autorizaci pro přístup k rozhraní API jménem uživatele, když se uživatel přihlásí.

  3. Uživateli je přiřazena klientská aplikace. Přiřazení aplikace uživateli zajistí, že je aplikace uvedená na portálu Moje aplikace pro daného uživatele. Uživatel může zkontrolovat a odvolat přístup udělený svým jménem ze svého Moje aplikace portálu.

Požadavky

Pokud chcete udělit souhlas s aplikací jménem jednoho uživatele, potřebujete:

  • Uživatelský účet s privilegovanou rolí Správa istrator, application Správa istrator nebo cloudovou aplikací Správa istrator

Než začnete, poznamenejte si následující podrobnosti z Centra pro správu Microsoft Entra:

  • ID aplikace pro aplikaci, ke které udělujete souhlas. Pro účely tohoto článku ji nazýváme klientskou aplikací.
  • Oprávnění rozhraní API, která klientská aplikace vyžaduje. Zjistěte ID aplikace rozhraní API a ID oprávnění nebo hodnoty deklarací identity.
  • Uživatelské jméno nebo ID objektu pro uživatele, jehož jménem je udělen přístup.

V tomto příkladu používáme Microsoft Graph PowerShell k udělení souhlasu jménem jednoho uživatele. Klientská aplikace je Microsoft Graph Explorer a udělujeme přístup k rozhraní Microsoft Graph API.

Pokud chcete udělit souhlas s aplikací jménem jednoho uživatele pomocí Prostředí Microsoft Graph PowerShell, musíte se přihlásit alespoň jako cloudová aplikace Správa istrator.

# 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 access panel.")
} 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"
}

Pokud chcete udělit souhlas s aplikací jménem jednoho uživatele pomocí rozhraní Microsoft Graph API, přihlaste se k Graph Explorerujako alespoň cloudová aplikace Správa istrator.

Musíte udělit souhlas s následujícími oprávněními:

Application.ReadWrite.All, , Directory.ReadWrite.AllDelegatedPermissionGrant.ReadWrite.All.

V následujícím příkladu udělíte delegovaná oprávnění definovaná rozhraním API prostředků klientské podnikové aplikaci jménem jednoho uživatele.

V příkladu je podniková aplikace zdroje Microsoft Graph ID objektu 11112222-bbbb-3333-cccc-4444dddd5555. Microsoft Graph definuje delegovaná oprávnění User.Read.All a Group.Read.All. ConsentType znamená Principal, že vyjadřujete souhlas jménem jednoho uživatele v tenantovi. ID objektu klientské podnikové aplikace je 00001111-aaaa-2222-bbbb-3333cccc4444. PrincipalId uživatele je aaaaaaaa-bbbb-cccc-1111-222222222222.

Upozornění

Dej si pozor! Udělená oprávnění prostřednictvím kódu programu podléhají kontrole ani potvrzení. Projeví se okamžitě.

  1. Načtěte všechna delegovaná oprávnění definovaná aplikací Microsoft Graph (aplikace prostředků) ve vaší aplikaci tenanta. Určete delegovaná oprávnění, která chcete klientské aplikaci udělit. V tomto příkladu jsou User.Read.All oprávnění delegování a Group.Read.All

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes
    
  2. Spuštěním následujícího požadavku udělte delegovaná oprávnění klientské podnikové aplikaci jménem uživatele.

    POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants
    
    Request body
    {
       "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
       "consentType": "Principal",
       "resourceId": "11112222-bbbb-3333-cccc-4444dddd5555",
       "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
       "scope": "User.Read.All Group.Read.All"
    }
    
  3. Spuštěním následujícího požadavku potvrďte, že jste uživateli udělili souhlas.

    GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq '00001111-aaaa-2222-bbbb-3333cccc4444' and consentType eq 'Principal'
    
  4. Přiřaďte aplikaci uživateli. Toto přiřazení zajistí, že se uživatel může přihlásit, pokud je potřeba přiřazení, a zajistí, aby aplikace byla dostupná prostřednictvím Moje aplikace portálu uživatele. V následujícím příkladu představuje klientskou aplikaci, resourceIdke které se uživatel přiřazuje. Uživateli je přiřazena výchozí role aplikace, která je 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"
        }
    

Další kroky