Använd en managed identity i kod
Hämta en token för en arbetslasts managed identity inifrån dess podd, med .NET-klienten eller ett vanligt HTTP-anrop.
Kod som körs i en arbetslasts podd kan hämta en kortlivad åtkomsttoken för arbetslastens managed identity. Med token kan koden anropa plattformens tjänster som arbetslasten, med de rättigheter identitetens roller ger — inget mer.
Viktigt
En annan arbetslasts poddar kan inte få den här token, men personer kan. Den som kan köra kommandon i arbetslastens poddar (Kubernetes
pods/exec: Owner, Contributor, Apps Operator, Blueprints Operator, Platform Owner och Platform Contributor, tilldelade på resursgruppen eller högre) kan läsa poddens bevis och hämta token. Den som kan skapa poddar i resursgruppens namnrymd (Owner, Contributor, Platform Owner, Platform Contributor, med direkt åtkomst till klustret) kan få en token för vilken identitet som helst i resursgruppen. Att ge en identitet en roll ger den därför i praktiken till dem också — se Hur arbetslasttoken utfärdas.
Vad podden får
| Variabel | Värde |
|---|---|
STACKSHIP_IDENTITY_RESOURCE_UID |
Vilken identitet som ska begäras |
STACKSHIP_IDENTITY_TOKEN_ENDPOINT |
Var den ska begäras, inne i klustret |
STACKSHIP_IDENTITY_POD_TOKEN_PATH |
Filen med poddens bevis på vem den är |
Container instances får också STACKSHIP_IDENTITY_PRINCIPAL_ID och
STACKSHIP_IDENTITY_CLIENT_ID när instansens spec.identity anger dem.
Vilka containrar som får dem:
| Arbetslast | Containrar |
|---|---|
| App | Appens container, i varje slot |
| Funktion | Funktionens container; identiteten är funktionsnamnutrymmets |
| Container instance | Varje container och init-container i en komponent som refererar till en valvhemlighet, eller som begär identiteten med identityInjection: true i API:t eller en blueprint-mall. Andra komponenter får inga |
Plattformens secret-init-container, som hämtar valvhemligheter när en podd startar, får dem också. Filagentens sidecar i en arbetslast med en beständig volym får inga.
Med .NET
Paketet Stackship.Identity.Client riktar sig mot .NET 10. ManagedIdentityCredential läser
variablerna ovan och hämtar och cachar token; DefaultStackshipCredential använder den när
variablerna finns, och faller annars tillbaka på ett tjänstekontos uppgifter från
STACKSHIP_CLIENT_ID, STACKSHIP_CLIENT_SECRET och STACKSHIP_TOKEN_ENDPOINT — praktiskt på en
utvecklares dator.
using Stackship.Identity.Client;
var credential = new DefaultStackshipCredential();
var token = await credential.GetTokenAsync();token.Token är bearer-token och token.ExpiresOn när den löper ut.
För att lägga token på varje utgående anrop ger du en HttpClient hanteraren:
var http = new HttpClient(new StackshipTokenCredentialHandler(credential));services.AddDefaultStackshipCredential() registrerar autentiseringen för dependency injection som
StackshipTokenCredential.
Secrets-klienten tar samma autentisering — se .NET-klienten.
Med ett vanligt HTTP-anrop
Skicka en POST till tokenslutpunkten med identitetens UID i sökvägen och poddens bevis i huvudet
X-Stackship-Pod-Token:
curl -s -X POST \
-H "X-Stackship-Pod-Token: $(cat "$STACKSHIP_IDENTITY_POD_TOKEN_PATH")" \
"$STACKSHIP_IDENTITY_TOKEN_ENDPOINT/$STACKSHIP_IDENTITY_RESOURCE_UID/token"Svaret är JSON med access_token, token_type (Bearer), expires_in i sekunder, client_id
och principal_id. Fråga igen när token löper ut, och läs beviset från filen på nytt varje gång:
det byts ut regelbundet.
När den svarar 404
Slutpunkten svarar 404 Not Found på samma sätt vid varje avvisning — ingen sådan identitet, inget
eller ett ogiltigt bevis, ett bevis från en annan arbetslasts podd eller ett anrop utifrån klustret
— så att den inte avslöjar vilka identiteter som finns. Kontrollera att anropet görs inne i
arbetslastens egen podd, att de tre variablerna är satta och att beviset finns i filen.
En token bevisar bara vem arbetslasten är. Vad den får göra kommer från identitetens roller — se Ge en managed identity en roll.