> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/da/sikkerhed/app-tokens.md).

# App Tokens

Tildel, administrer og migrer app-tokens i PowerShell Universal til API-adgang, herunder roller, signeringsnøgler og forbedret tokensikkerhed.

De kan bruge PowerShell Universal-app-tokens med både [brugerdefinerede API-slutpunkter](/powershell-universal/da/api/endpoints.md) og [Management API](/powershell-universal/da/config/management-api.md). Management API bruger standardrollerne Administrator, Operator og Reader. App-tokens til det brugerdefinerede API kan anvende brugerdefinerede roller såvel som de indbyggede.

De kan tildele App Tokens ved hjælp af Admin Console, eller De kan bruge administrations-API'en direkte.

## Admin Console

For at tildele et token i Admin Console skal De gå til Secure > Application Tokens. Klik på knappen Create App Token for at tildele et App Token.

Når De klikker på Create App Token, giver en dialogboks Dem mulighed for at angive Identity, Role og tokenets udløbstidspunkt.

## Management API

De kan også tildele app-tokens til brugere fra administrations-API'en. For at tildele et App Token programmatisk ved hjælp af API'en kan De gøre følgende:

{% code collapsedlinecount="10" %}

```
PS C:\Users\adamr> Invoke-RestMethod http://localhost:5000/api/v1/signin -Method POST -Body (@{ username = 'admin'; password = 'test' } | ConvertTo-Json) -SessionVariable Session -ContentType 'application/json'
PS C:\Users\adamr> Invoke-RestMethod http://localhost:5000/api/v1/apptoken/grant  -WebSession $Session

id          : 3
token       : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2Ns
              YWltcy9uYW1lIjoiYWRtaW4iLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9oYXNoI
              joiYjJlOGM4MDktMjE0NS00NjhhLWI4NTEtYjU0MjVhZDgzOTQ2Iiwic3ViIjoiUG93ZXJTaGVsbFVuaXZlcnNhbCIsImh0dHA6Ly9zY2
              hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6WyJBZG1pbmlzdHJhdG9yIiwiT3BlcmF0b3I
              iLCJSZWFkZXIiXSwibmJmIjoxNTkzMTkyMjY1LCJleHAiOjE2MjQ3MjgyNjUsImlzcyI6Iklyb25tYW5Tb2Z0d2FyZSIsImF1ZCI6IlBv
              d2VyU2hlbGxVbml2ZXJzYWwifQ.hnKyXe8C4kbrmkeeUFr-LUDjVr-xP7fRWwgClcrnxfc
identity    : @{id=3; name=admin; source=0; role=}
revoked     : False
role        : Administrator, Operator, Reader
created     : 26/06/2020 17:24:25
expiration  : 26/06/2021 17:24:25
revokedDate : 01/01/0001 00:00:00
```

{% endcode %}

Administratorer kan tildele app-tokens til enhver bruger ved at angive brugerens identitets-id. For at tildele et app-token til en identitet via REST API skal brugeren have en defineret rolle. Rollen Operator definerer brugeren, og brugerens App Token får adgang baseret på den rolle.

{% code collapsedlinecount="10" %}

```
PS C:\Users\adamr> Invoke-RestMethod http://localhost:5000/api/v1/apptoken/grant/2  -WebSession $Session

id          : 4
token       : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2Ns
              YWltcy9uYW1lIjoiYWRhbUBpcm9ubWFuc29mdHdhcmUub25taWNyb3NvZnQuY29tIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd
              3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvaGFzaCI6IjhhYWM2NWFmLTA2NmItNDYwNy1hMGJjLTNlYTM2ZDY2YjJmMSIsInN1YiI6Il
              Bvd2VyU2hlbGxVbml2ZXJzYWwiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3J
              vbGUiOiJPcGVyYXRvciIsIm5iZiI6MTU5MzE5MjM2MCwiZXhwIjoxNjI0NzI4MzYwLCJpc3MiOiJJcm9ubWFuU29mdHdhcmUiLCJhdWQi
              OiJQb3dlclNoZWxsVW5pdmVyc2FsIn0.9VYiRFOojFyZMH0E5rwdfFcOkoasXFrrWJDNtYk0PIw
identity    : @{id=2; name=adam@ironmansoftware.onmicrosoft.com; source=0; role=}
revoked     : False
role        : Operator
created     : 26/06/2020 17:26:00
expiration  : 26/06/2021 17:26:00
revokedDate : 01/01/0001 00:00:00
```

{% endcode %}

## Roller

Roller for App Tokens tildeles direkte i selve tokenet. Roller angiver, hvad tokenet kan udføre. Rollerne beregnes ikke under brug, så tilknytning fra rolle til claim fungerer ikke med app-tokens.

Vi foreslår også at begrænse antallet af roller i et app-token. Jo flere roller der føjes til tokenet, desto større bliver tokenet, hvilket reducerer ydeevnen eller forårsager problemer med visse værktøjer, der ikke tillader længere tokenværdier.

De kan bruge brugerdefinerede roller med et brugerdefineret sæt tilladelser for at begrænse antallet af roller, men samtidig give brugerdefineret adgang til PowerShell Universal-platformen. Tilladelser evalueres, når rollen bruges. Det betyder, at tildeling af en brugerdefineret rolle til et token gør det mere fleksibelt end en indbygget rolle, da tilladelserne kan tilføjes eller fjernes fra en rolle uden at generere et nyt token.

## Migrering af app-tokens

De kan migrere app-tokens mellem systemer ved hjælp af administrations-API'et. Dette er nyttigt, når De udvikler til scenarier med høj tilgængelighed.

Følgende er et eksempel på den POST, der kræves for at oprette et eksisterende app-token i en vilkårlig PSU-instans. Bemærk, at signeringsnøglen skal være den samme mellem instanserne. De skal bruge et gyldigt app-token i målsystemet for at oprette de migrerede tokens.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod http://localhost:5000/api/v1/apptoken -Method POST -Body (@{
        Token      = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiQWRtaW4iLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9oYXNoIjoiMDhiYTFlMTktMjgyZi00YTRjLWIxZGUtNTY0Zjk3NWU2ODEwIiwic3ViIjoiUG93ZXJTaGVsbFVuaXZlcnNhbCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6InBvbGljeSIsIm5iZiI6MTYzMzEwNjkzMywiZXhwIjoxNjQwODg2NDgwLCJpc3MiOiJJcm9ubWFuU29mdHdhcmUiLCJhdWQiOiJQb3dlclNoZWxsVW5pdmVyc2FsIn0.GHjJI3kMpcAY1pvOGLWOdPqC2-IPo0-4lJfHZwStmOk'
        Identity   = @{
            Name = 'Admin'
        }
        Role       = 'Administrator'
        Expiration = (Get-Date).AddMonths(6)
    } | ConvertTo-Json) -Headers @{
    "Content-Type"  = "application/json";
    "Authorization" = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiQWRtaW4iLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9oYXNoIjoiMjVjMzFlZTAtMGM4Mi00NzBiLWJkZGYtOGFmOTgxZGI2ZDdmIiwic3ViIjoiUG93ZXJTaGVsbFVuaXZlcnNhbCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluaXN0cmF0b3IiLCJuYmYiOjE2MzM2NDY5OTgsImV4cCI6MTYzNjIzODk0MCwiaXNzIjoiSXJvbm1hblNvZnR3YXJlIiwiYXVkIjoiUG93ZXJTaGVsbFVuaXZlcnNhbCJ9.jw2VCvtpOWpgnpIUlO8sTdK9Z5RMoWLmvYn0MDmzkNM"   
}
```

{% endcode %}

## Forbedret sikkerhed for app-tokens

Når udvidet sikkerhed for app-tokens er aktiveret, er tokenværdier kun tilgængelige ved oprettelsen. Værdierne hashes, og databasen gemmer hashværdien i stedet for tokenet. De bruger tokenet på samme måde som ethvert andet token.

{% hint style="warning" %}
Aktivering af sikkerhed for app-tokens ugyldiggør alle eksisterende tokens.
{% endhint %}

## Systemtokens

Systemtokens er en måde at levere tokens til ikke-brugersystemer på. Tokens er ikke knyttet direkte til en brugers identitet. De kan angive et navn til tokenet samt udløb og roller.

## Signeringsnøgler

### Lokal signeringsnøgle

Som standard opretter PowerShell Universal en signeringsnøgle baseret på strengen Jwt \ SigningKey i appsettings.json. Denne værdi bruges til at indkode og afkode tokenet. Hvis signeringsnøglerne ikke stemmer overens, betragtes tokenet som ugyldigt. Ændring af signeringsnøglen ugyldiggør alle eksisterende signeringsnøgler.

### Fjernsigneringsnøgle

De kan bruge et OAuth 2.0-discoverydokument til validering af signeringsnøgler. Ved at bruge et fjernsystem som dette kan De sikre, at PowerShell Universal-konfigurationen ikke behøver at blive ændret, når signeringsnøglerne ændres. For at bruge en ekstern signeringsnøgle skal De angive værdien Jwt \ DiscoveryDocument i appsettings.json til URL'en for OAuth 2.0-metadatadokumentet. Når PowerShell Universal indlæses, læser den signeringsnøglerne fra dokumentet og giver dem til JWT-valideringssystemet.

{% code collapsedlinecount="10" %}

```json
{
    "Jwt" : {
        "DiscoveryDocument": "https://auth20/metadata.xml"
    }
}
```

{% endcode %}

## Eksterne app-tokens

Når De konfigurerer en fjernsigneringsnøgle, genereres tokens derefter af OAuth 2.0-udbyderen. Derfor genereres claimsoplysningerne også af denne udbyder. For at tildele roller og tilladelser korrekt i PowerShell Universal skal De sikre, at de rette claims er defineret i tokenet. PowerShell Universal evaluerer følgende claimværdier i et token.

* PSUPermission - Definerer tokenets tilladelser
* Roles - Definerer rollerne for tokenet.

For at give adgang til ressourcer i en PowerShell Universal-instans skal De sikre, at tokenet indeholder de rette claims. Følgende token ville for eksempel give al adgang til administrations-API'erne i PowerShell Universal, fordi det indeholder claimet `PSUPermission` med en vælger for alle tilladelser. De kan bruge [eksemplet nedenfor](#example-auth0-access-token-with-custom-claims) til at se, hvordan De gør dette i Auth0.

{% code collapsedlinecount="10" %}

```json
{
  "PSUPermission": "(.*)",
  "iss": "https://myprovider.us.auth0.com/",
  "sub": "wKeaTMprlv7kX46eI9SwwvaGJzWPkbtt@clients",
  "aud": "https://mydomain.com",
  "iat": 1758898719,
  "exp": 1758985119,
  "scope": "(.*) Administrator",
  "gty": "client-credentials",
  "azp": "wKeaTMprlv7kX46eI9SwwvaGJzWPkbtt",
  "permissions": [
    "(.*)",
    "Administrator"
  ]
}
```

{% endcode %}

Alternativt kan De aktivere evaluering af claims for JWT-tokens. Som standard bruger PowerShell Universal et statisk sæt tilladelser, når der modtages et token. Hvis De aktiverer evaluering af claims for JWT-tokens, behandler autorisationssystemet tokenet og tilføjer tilladelserne, når tokenet bruges, i stedet for når det genereres.

### Evaluering af claims for tokens

For at aktivere Claim Evaluation for Tokens kan De justere appsettings.json, så PSU kører evaluering af claims under udførelsen af tokenvalideringen.

{% code collapsedlinecount="10" %}

```json
{
    "Jwt": {
        "EvaluateClaims": "true"
    }
}
```

{% endcode %}

Dette bruger `roles.ps1` til at kontrollere claims for de tokens, der leveres, og tildele tilladelser baseret på de kvalificerede roller.

### Eksempel: Auth0-adgangstoken med claims-evaluering

Ved hjælp af standardfunktioner i Auth0 kan De generere tokens, der derefter kan levere roller baseret på tokenets claims. Dette kræver ingen særlige udløsere eller handlinger i Auth0.

#### Opret et Auth0-program

I Auth0 skal De oprette et program til et almindeligt webprogram. De kan gøre det ved at klikke på Applications \ Applications og derefter Create Application.

#### Opret en Auth0-API

Opret derefter en Auth0 API ved at klikke på Applications \ APIs og derefter Create API. Angiv navnet og navneområdet til entydige værdier, og lad resten af valgmulighederne være standard.

#### Opret brugerdefinerede tilladelsesomfang i Deres API

Definer brugerdefinerede tilladelser i Deres API, f.eks. én med et rollenavn.

#### Godkend programmet til at bruge API'en

I programindstillingerne skal De klikke på APIs og slå kontakten ved API'en til for at autorisere programmet til at bruge API'en. Vælg de tilladelser, De gerne vil give programmet. Disse vises som tilladelsesclaims i tokenet.

#### Hent et adgangstoken fra Auth0

Når programmet og API'en er defineret, kan De nu anmode om et adgangstoken i Auth0. Værdierne `client_id` og `client_secret` findes på siden Application Details. Værdien `audience` skal være Identifier for Deres API.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod 'https://ironmansoftware.us.auth0.com/oauth/token' -Body @{
    client_id = "xyz123"
    client_secret = "xyz123"
    audience = "https://powershelluniversal.com"
    grant_type = "client_credentials"
} -Method POST
```

{% endcode %}

#### Konfigurer PowerShell Universal

De skal konfigurere PowerShell Universal til at bruge Auth0 som JWT-udbyder. De kan gøre det ved at justere filen appsettings.json. Disse bør indeholde værdier fra Auth0. `DiscoveryDocument` vil være en del af Deres lejer og hjælper med at definere data som signeringsnøglerne til JWT-tokens. `Issuer` vil være URL'en til Deres lejer. `Audience` vil være identifikatoren for Deres API.

{% code collapsedlinecount="10" %}

```json
{
    "Jwt": {
        "DiscoveryDocument": "https://ironmansoftware.us.auth0.com/v2.0/.well-known/openid-configuration",
        "Issuer": "https://ironmansoftware.us.auth0.com/",
        "Audience": "https://powershelluniversal.com",
        "EvaluateClaims": "true"
    }
}
```

{% endcode %}

#### Konfigurer en rolle, der skal knyttes til Auth0-tilladelsen

Opret til sidst en rolle, der knyttes til Auth0-tilladelsen. Følgende eksempel kontrollerer, at API-tokenet har et tilladelses-claim med værdien `Administrator`, sådan som vi konfigurerede ovenfor. I så fald tildeles tokenet rollen API Admin, som har alle tilladelser i PowerShell Universals Management API.

{% code collapsedlinecount="10" %}

```powershell
New-PSURole -Name "API Admin" -Permissions ".*" -ClaimType "permissions" -ClaimValue "Administrator"
```

{% endcode %}

#### Brug af et App Token med PowerShell Universal

Nu hvor De har et Auth0-app-token, kan De bruge det på samme måde, som De ville med indbyggede app-tokens.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod http://localhost:5000/api/v1/identity/my -Headers @{ Authorization = "tokenValue" }
```

{% endcode %}

### Eksempel: Auth0-adgangstoken med brugerdefinerede claims

De kan bruge Auth0 APIs og Applications til at levere app-tokens til PowerShell Universal.

#### Opret et Auth0-program

I Auth0 skal De oprette et program til et almindeligt webprogram. De kan gøre det ved at klikke på Applications \ Applications og derefter Create Application.

#### Opret en Auth0-API

Opret derefter en Auth0 API ved at klikke på Applications \ APIs og derefter Create API. Angiv navnet og navneområdet til entydige værdier, og lad resten af valgmulighederne være standard.

#### Godkend programmet til at bruge API'en

I Application settings skal De klikke på APIs og slå switchen ved API'en til for at autorisere programmet til at bruge API'en.

#### Hent et adgangstoken fra Auth0

Når programmet og API'en er defineret, kan De nu anmode om et adgangstoken i Auth0. Værdierne `client_id` og `client_secret` findes på siden Application Details. Værdien `audience` skal være Identifier for Deres API.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod 'https://ironmansoftware.us.auth0.com/oauth/token' -Body @{
    client_id = "xyz123"
    client_secret = "xyz123"
    audience = "https://powershelluniversal.com"
    grant_type = "client_credentials"
} -Method POST
```

{% endcode %}

#### Konfigurer PowerShell Universal

De skal konfigurere PowerShell Universal til at bruge Auth0 som JWT-udbyder. De kan gøre det ved at justere filen appsettings.json. Disse bør indeholde værdier fra Auth0. `DiscoveryDocument` vil være en del af Deres lejer og hjælper med at definere data som signeringsnøglerne til JWT-tokens. `Issuer` vil være URL'en til Deres lejer. `Audience` vil være identifikatoren for Deres API.

{% code collapsedlinecount="10" %}

```json
{
    "Jwt": {
        "DiscoveryDocument": "https://ironmansoftware.us.auth0.com/v2.0/.well-known/openid-configuration",
        "Issuer": "https://ironmansoftware.us.auth0.com/",
        "Audience": "https://powershelluniversal.com"
    }
}
```

{% endcode %}

#### Brug af et App Token med PowerShell Universal

Nu hvor De har et Auth0-app-token, kan De bruge det på samme måde, som De ville med indbyggede app-tokens.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod http://localhost:5000/api/v1/identity/my -Headers @{ Authorization = "tokenValue" }
```

{% endcode %}

#### Valgfrit: definer en Auth0-handlingsudløser

Når der udstedes et nyt adgangstoken fra Auth0, indeholder de ikke standardrollerne eller tilladelserne som indbyggede app-tokens i PowerShell Universal. De kan styre dette ved at definere en Custom Action og tildele den til udløseren `credential-exchange`.

Klik på Actions og derefter Library og Create Action og derefter Create Custom Action. Vælg Password Reset / Post Challenge Trigger, og navngiv handlingen.

Definer handlingen ved at angive et brugerdefineret claim for claimtypen `PSUPermission`. Dette eksempel giver ganske enkelt al adgang til PowerShell Universal-API'er. De kan bruge hændelseskontekst til at definere, hvilke tilladelser der modtages, baseret på adgangstokenanmodningen.

{% code collapsedlinecount="10" %}

```javascript
exports.onExecuteCredentialsExchange = async (event, api) => {
  api.accessToken.setCustomClaim("PSUPermission", "(.*)")
};
```

{% endcode %}

Tilføj derefter handlingen til arbejdsflowudløseren for `credential-exchange` ved at klikke på Actions og derefter Triggers og derefter `credential-exchange.`

Træk handlingen Set Permissions ind i arbejdsflowet.

Når dette er fuldført, kan De generere et nyt token og få adgang til ethvert API i PowerShell Universal.

{% code collapsedlinecount="10" %}

```powershell
Invoke-RestMethod http://localhost:5000/api/v1/identity -Headers @{ Authorization = "tokenValue" }
```

{% endcode %}

### Se også

* [Devolutions Academy – Oversigt og godkendelse](https://academy.devolutions.net/student/activity/3542770-part-1-outline-and-authentication)
* [Devolutions Academy – Godkendelse](https://academy.devolutions.net/student/path/3465905/activity/5612255)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/powershell-universal/da/sikkerhed/app-tokens.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
