Berikan persetujuan atas nama satu pengguna menggunakan PowerShell

Dalam artikel ini, Anda mempelajari cara memberikan persetujuan atas nama satu pengguna dengan menggunakan PowerShell.

Ketika pengguna memberikan persetujuan untuk diri mereka sendiri, peristiwa berikut terjadi lebih sering:

  1. Perwakilan layanan untuk aplikasi klien dibuat, jika belum ada. Perwakilan layanan adalah instans aplikasi atau layanan di penyewa Microsoft Entra Anda. Akses yang diberikan ke aplikasi atau layanan dikaitkan dengan objek utama layanan ini.

  2. Untuk setiap API yang memerlukan akses aplikasi, pemberian izin yang didelegasikan ke API tersebut dibuat untuk izin yang dibutuhkan aplikasi. Akses diberikan atas nama pengguna. Pemberian izin yang didelegasikan mengotorisasi aplikasi untuk mengakses API atas nama pengguna, saat pengguna tersebut masuk.

  3. Pengguna diberikan aplikasi klien. Menetapkan aplikasi ke pengguna memastikan bahwa aplikasi tercantum di portal Aplikasi Saya untuk pengguna tersebut. Pengguna dapat meninjau dan mencabut akses yang diberikan atas nama mereka dari portal Aplikasi Saya mereka.

Prasyarat

Untuk memberikan izin ke aplikasi atas nama satu pengguna, Anda memerlukan:

  • Akun pengguna dengan Administrator Peran Istimewa, Administrator Aplikasi, atau Administrator Aplikasi Cloud

Sebelum memulai, rekam detail berikut dari pusat admin Microsoft Entra:

  • ID aplikasi untuk aplikasi yang Anda berikan persetujuan. Untuk tujuan artikel ini, kami menyebutnya aplikasi klien.
  • Izin API yang diperlukan aplikasi klien. Cari tahu ID aplikasi API dan ID izin atau nilai klaim.
  • Nama pengguna atau ID objek untuk pengguna yang akses atas namanya diberikan.

Untuk contoh ini, kami menggunakan Microsoft Graph PowerShell untuk memberikan persetujuan atas nama satu pengguna. Aplikasi klien adalah Microsoft Graph Explorer, dan kami memberikan akses ke Microsoft Graph API.

Untuk memberikan persetujuan ke aplikasi atas nama satu pengguna menggunakan Microsoft Graph PowerShell, Anda perlu masuk setidaknya sebagai Administrator Aplikasi Cloud.

# 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"
}

Untuk memberikan persetujuan ke aplikasi atas nama satu pengguna menggunakan Microsoft Graph API, masuk ke Graph Explorer setidaknya sebagai Administrator Aplikasi Cloud.

Anda perlu menyetujui izin berikut:

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

Dalam contoh berikut, Anda memberikan izin yang didelegasikan yang ditentukan oleh API sumber daya ke aplikasi perusahaan klien atas nama satu pengguna.

Dalam contoh, aplikasi perusahaan sumber daya adalah Microsoft Graph ID 11112222-bbbb-3333-cccc-4444dddd5555objek . Microsoft Graph menentukan izin yang didelegasikan, User.Read.All dan Group.Read.All. ConsentType adalah Principal, menunjukkan bahwa Anda menyetujui atas nama satu pengguna di penyewa. ID objek aplikasi perusahaan klien adalah 00001111-aaaa-2222-bbbb-3333cccc4444. PrincipalId pengguna adalah aaaaaaaa-bbbb-cccc-1111-222222222222.

Perhatian

Hati-hati! Izin yang diberikan secara terprogram tidak tunduk pada peninjauan atau konfirmasi. Mereka segera berlaku.

  1. Ambil semua izin yang didelegasikan yang ditentukan oleh Microsoft graph (aplikasi sumber daya) di aplikasi penyewa Anda. Identifikasi izin yang didelegasikan yang ingin Anda berikan ke aplikasi klien. Dalam contoh ini, izin delegasi adalah User.Read.All dan Group.Read.All

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes
    
  2. Berikan izin yang didelegasikan ke aplikasi perusahaan klien atas nama pengguna dengan menjalankan permintaan berikut.

    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. Konfirmasikan bahwa Anda telah memberikan persetujuan kepada pengguna dengan menjalankan permintaan berikut.

    GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq '00001111-aaaa-2222-bbbb-3333cccc4444' and consentType eq 'Principal'
    
  4. Tetapkan aplikasi kepada pengguna. Penugasan ini memastikan bahwa pengguna dapat masuk jika penugasan diperlukan, dan memastikan bahwa aplikasi tersedia melalui portal Aplikasi Saya pengguna. Dalam contoh berikut, resourceIdmewakili aplikasi klien tempat pengguna ditetapkan. Pengguna diberi peran aplikasi default yaitu 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"
        }
    

Langkah berikutnya