Hovedmenu
Devolutions-blog

Nyheder, opdateringer og indsigter fra Devolutions.

Devolutions PowerShell Universal Azure Entra ID password reset illustration for the blog.

Byg en formular til nulstilling af adgangskode i Azure Entra ID med Microsoft Graph og PowerShell Universal

Registrer en Entra ID-app, gem OIDC-tokens i PowerShell Universal 5.5, søg efter brugere med Get-MgUser, og nulstil derefter en adgangskode med Update-MgUser fra MgResetPassword.ps1.

I dette indlæg gennemgår vi, hvordan du opretter en formular til nulstilling af adgangskode til Azure Entra ID med Microsoft Graph og PowerShell Universal. Vi bruger modulerne Microsoft.Graph.Authentication og Microsoft.Graph.Users til at oprette forbindelse til Graph som den aktuelle bruger og nulstille en anden brugers adgangskode.

Konfiguration af Azure Entra ID

Første trin er at oprette en appregistrering i Azure Entra ID til PowerShell Universal. Det lader brugerne logge ind med OpenID Connect og deres Entra ID-legitimationsoplysninger. Vi konfigurerer også API-tilladelserne, så der er adgang til Microsoft Graph.

I appregistreringen skal du sætte callback-stien til at pege på PowerShell Universal-serveren. HTTPS er påkrævet. Porten kan være den, PowerShell Universal lytter på. Medtag en callback-sti til logon. Du konfigurerer den samme værdi i PowerShell Universal.

Omdirigerings-URI i en Entra ID-appregistrering, der peger på callback til logon i PowerShell Universal.
Callback-URL for appregistreringen til PowerShell Universal

Sørg derefter for, at følgende tokentyper er valgt.

Tokenkonfiguration i Entra ID med id-tokens og access-tokens aktiveret.
Id- og access-tokentyper på appregistreringen

Opsæt nu de tilladelser, du delegerer til applikationen og til den bruger, der logger ind. Tilladelserne er nødvendige for at slå brugere op og nulstille deres konti. Tilladelsen Directory.AccessAsUser.All er nødvendig for at sætte en anden brugers adgangskode. Den kan ikke tildeles en applikation og skal gives via delegering. Brugere i gruppen Global Administrator har denne tilladelse.

API-tilladelser i Entra ID, herunder Directory.AccessAsUser.All til delegeret nulstilling af adgangskode.
Delegerede Graph-tilladelser til brugeropslag og nulstilling af adgangskode

Generer til sidst en ny klienthemmelighed til brug i PowerShell Universal.

Siden Certifikater og hemmeligheder i Entra ID med en nyoprettet klienthemmelighed.
Klienthemmelighed til appregistreringen for PowerShell Universal

Konfigurer godkendelse i PowerShell Universal

Nu hvor appregistreringen findes i Entra ID, skal du konfigurere PowerShell Universal til at godkende som brugeren og levere et access-token til Microsoft Graph. Klik på Security > Authentication, og tilføj OpenID Connect til listen over metoder. I egenskaberne forbinder du appregistreringen med PowerShell Universal.

Du skal angive følgende værdier. Det er eksempelværdier. Dine er anderledes og afhænger af din tenant:

  • Callback Path: https://localhost:5001/signin-oidc. Det er den samme URL, du angav i appregistreringen.
  • Client ID: 21a267e2-893d-4e0d-a85e-ff21757f082b. Id’et for appregistreringen på siden Overview.
  • Client Secret: xyz123. Den klienthemmelighed, du genererede i appregistreringen.
  • Authority: https://login.microsoftonline.com/3eca8ff3-f62f-431b-88f5-b40183116004. Logontjenesten i Microsoft Entra ID. GUID’et er dit tenant-id.
  • Resource: https://graph.microsoft.com. Den ressource, access-tokenet skal give adgang til.
  • Save Tokens: true. PowerShell Universal skal gemme access-tokenet, så appen kan bruge det.
  • Response Type: id_token token. Entra ID skal returnere tokens, så du kan delegere adgang senere.
  • Scope: openid profile groups offline_access. Access-tokens skal indeholde gruppemedlemskab og profiloplysninger.

Når du har gennemført konfigurationen, kan du logge ind på PowerShell Universal med OpenID Connect. For at kontrollere det skal du logge ud af din konto og klikke på knappen til logon med OpenID Connect.

Installer Microsoft Graph-moduler

Du skal installere følgende Graph-moduler for at bruge eksemplet. De versioner, der er brugt her, står nedenfor.

  • Microsoft.Graph.Authentication 2.26.1
  • Microsoft.Graph.Users 2.26.1

Det gør du ved at gå til Platform > Modules > Galleries i administratorkonsollen. Vi brugte følgende version af PowerShell Universal til denne demo.

  • PowerShell Universal 5.5.0

App til nulstilling af adgangskode

Nu hvor godkendelsen er konfigureret, kan vi oprette appen til nulstilling af adgangskode. Gem først nogle variabler til at tilgå Microsoft Graph via appregistreringen. Gå til Platform > Variables, og opret følgende variabler.

  • PSUMgTenantId: 3eca8ff3-f62f-431b-88f5-b40183116004. Det samme tenant-id som i OIDC-konfigurationen.
  • PSUMgClientSecret: en PS Credential, hvis brugernavn er appregistreringens id (21a267e2-893d-4e0d-a85e-ff21757f082b), og hvis adgangskode er klienthemmeligheden.

Når variablerne er oprettet, skal du gå til Apps > Apps og oprette en ny app. Klik på Edit Code for at definere appens indhold.

# Connect as the application. Use the process context scope to avoid affecting other apps.
# We are passing in the tenant ID and client secret.
# We are connecting when the app is starting to avoid connecting every time the page is loaded.
Connect-MgGraph -TenantId $PSUMgTenantId -ClientSecretCredential $Secret:PSUMgClientSecret -ContextScope Process -NoWelcome

New-UDApp -Content {

    New-UDForm -Children {
        New-UDAutocomplete -OnLoadOptions {
            Get-MgUser -ConsistencyLevel eventual -Count userCount -Search "`"DisplayName:$Body`"" | ForEach-Object {
                New-UDAutocompleteOption -Name $_.DisplayName -Value $_.Id
            }
        } -Label "User" -Id 'UserId'
        New-UDTextbox -Label 'Password' -Type password -Id 'Password'
        New-UDTextbox -Label 'Confirm Password' -Type password -Id 'ConfirmPassword'
    } -OnValidate {
        if ([string]::IsNullOrEmpty($EventData.UserId)) {
            New-UDValidationResult -ValidationError "User is required"
            return
        }

        if ([string]::IsNullOrEmpty($EventData.Password) -or [string]::IsNullOrEmpty($EventData.ConfirmPassword)) {
            New-UDValidationResult -ValidationError "Password is required"
            return
        }

        if ($EventData.Password -cne $EventData.ConfirmPassword) {
            New-UDValidationResult -ValidationError "Passwords do not match"
            return
        }

        $MgUser = Get-MgUser -UserId $EventData.UserId
        if ($MgUser -eq $null) {
            New-UDValidationResult -ValidationError "Unable to locate user."
            return
        }

        New-UDValidationResult -Valid
    } -OnSubmit {

        if ($AccessToken -eq $null) {
            throw "Access Token is required. Ensure you have Save Tokens enabled in your OpenID Connect authentication method."
        }

        Set-PSUCache -Key "MgAccessToken_$User" -Value $AccessToken

        $PasswordKey = (New-Guid).ToString()
        Set-PSUCache -Key $PasswordKey -Value $EventData.Password -AbsoluteExpiration (Get-Date).AddMinutes(5)

        Invoke-PSUScript -Name 'MgResetPassword.ps1' -Parameters @{
            ResetUser = $EventData.UserId
            PasswordKey = $PasswordKey
        } -Wait -Integrated | Out-Null

        Show-UDSnackbar -Message "Password reset!" -Variant success
    }
}

Appen opretter forbindelse til Graph som applikationen, når den starter, ved hjælp af Connect-MgGraph og processens kontekstscope, så andre apps ikke påvirkes. Formularen søger efter brugere med Get-MgUser, kontrollerer, at adgangskoderne stemmer overens, og cacher derefter den indloggede brugers access-token og den nye adgangskode. Caching undgår, at access-tokenet gemmes som ren tekst i jobhistorikken, og bruger den midlertidige cache, så værdierne ikke overlever genstarter.

Formularen kalder derefter MgResetPassword.ps1 med Invoke-PSUScript. Et script isolerer Microsoft Graph-forbindelsen, så den kun er knyttet til denne bruger (flere personer kan bruge appen samtidig), og giver dig automatisk jobhistorik over, hvilken operatør der nulstillede hvilken konto.

Den færdige app ser sådan ud.

Appformular i PowerShell Universal med autofuldførelse af bruger og felter til nulstilling af adgangskode.
Formular til nulstilling af adgangskode i Entra ID i en Universal-app

Nulstillingsscript

Nu hvor brugerfladen er defineret, skal du opsætte nulstillingsscriptet, der udfører selve handlingen. Klik på Automation > Scripts, og opret et nyt script. Navngiv scriptet MgResetPassword.ps1. Klik på fanen Execution, og sæt Environment til PowerShell 7. Når det er oprettet, skal du klikke på Edit Code og indtaste følgende.

param($ResetUser, $PasswordKey)

try {
    $Password = Get-PSUCache -Key $PasswordKey
    if (-not $Password) {
        throw "Target password not found."
    }

    $AccessToken = Get-PSUCache -Key "MgAccessToken_$($UAJob.Identity.Name)"
    if (-not $AccessToken) {
        throw "Access token not found for $($UAJob.Identity.Name)"
    }

    Connect-MgGraph -AccessToken ($AccessToken | ConvertTo-SecureString -AsPlainText -Force) -NoWelcome

    $User = Get-MgUser -UserId $ResetUser

    if ($User -eq $null) {
        throw "Failed to look up user: $ResetUser"
    }

    $password = @{
        Password = $Password
        ForceChangePasswordNextSignIn = $false
    }
    Update-MgUser -UserId $User.Id -PasswordProfile $password
} finally {
    Remove-PSUCache -Key $PasswordKey
}

Scriptet læser adgangskoden og den aktuelle operatørs access-token fra cachen, opretter forbindelse til Graph med det token, slår målbrugeren op og kalder derefter Update-MgUser med en adgangskodeprofil. Derefter fjerner det adgangskoden fra cachen.

Når scriptet er oprettet, kan du prøve appen. Du skal logge ind som en bruger med de rette Entra ID-tilladelser til at udføre handlingerne. Når du klikker på send i formularen, ser du en succesmeddelelse og et nyt job i jobhistorikken.

Succes-snackbar og jobhistorik i PowerShell Universal efter en nulstilling af adgangskode i Entra ID.
Vellykket nulstilling af adgangskode og jobhistorik

Klar til at bygge? Download PowerShell Universal.