Ge åtkomst till webbprogram med hjälp av OpenID Connect och Azure Active Directory
Varning
Det här innehållet gäller för den äldre Azure AD v1.0-slutpunkten. Använd Microsofts identitetsplattform för nya projekt.
OpenID Connect är ett enkelt identitetslager som bygger på OAuth 2.0-protokollet. OAuth 2.0 definierar mekanismer för att hämta och använda åtkomsttoken för åtkomst till skyddade resurser, men de definierar inte standardmetoder för att tillhandahålla identitetsinformation. OpenID Connect implementerar autentisering som ett tillägg till OAuth 2.0-auktoriseringsprocessen. Den innehåller information om slutanvändaren i form av en id_token
som verifierar användarens identitet och tillhandahåller grundläggande profilinformation om användaren.
OpenID Connect är vår rekommendation om du skapar ett webbprogram som finns på en server och som nås via en webbläsare.
Registrera ditt program med din AD-klient
Registrera först ditt program med din Azure Active Directory-klientorganisation (Azure AD). Det ger dig en program-ID för ditt program och låter det ta emot tokens.
Logga in på Azure-portalen.
Välj din Azure AD klient genom att välja ditt konto i det övre högra hörnet på sidan, följt av att välja navigeringen Växla katalog och sedan välja lämplig klientorganisation.
- Hoppa över det här steget om du bara har en Azure AD klientorganisation under ditt konto eller om du redan har valt rätt Azure AD klientorganisation.
I Azure Portal söker du efter och väljer Azure Active Directory.
I den vänstra menyn i Azure Active Directory väljer du Appregistreringar och sedan Ny registrering.
Följ anvisningarna och skapa ett nytt program. Det spelar ingen roll om det är ett webbprogram eller ett offentligt klientprogram (mobilt & skrivbord) för den här självstudien, men om du vill ha specifika exempel för webbprogram eller offentliga klientprogram kan du läsa våra snabbstarter.
- Namn är appens namn och beskriver appen för användarna.
- Under Kontotyper som stöds väljer du Accounts in any organizational directory and personal Microsoft accounts (Konton i alla organisationskataloger och personliga Microsoft-konton).
- Ange omdirigerings-URI:n. För webbprogram är detta bas-URL:en för din app där användarna kan logga in. Till exempel
http://localhost:12345
. För offentliga klienter (mobila & desktop) använder Azure AD den för att returnera tokensvar. Ange ett specifikt värde för ditt program. Till exempelhttp://MyFirstAADApp
.
När du har slutfört registreringen tilldelar Azure AD programmet en unik klientidentifierare (program-ID). Du behöver det här värdet i nästa avsnitt, så kopiera det från programsidan.
Om du vill hitta ditt program i Azure Portal väljer du Appregistreringar och sedan Visa alla program.
Autentiseringsflöde med OpenID Connect
Det mest grundläggande inloggningsflödet innehåller följande steg – var och en av dem beskrivs i detalj nedan.
OpenID Connect-metadatadokument
OpenID Connect beskriver ett metadatadokument som innehåller merparten av den information som krävs för att en app ska kunna utföra inloggning. Detta inkluderar information som url:er som ska användas och platsen för tjänstens offentliga signeringsnycklar. Dokumentet OpenID Connect-metadata finns på:
https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration
Metadata är ett enkelt JSON-dokument (JavaScript Object Notation). Se följande kodfragment för ett exempel. Innehållet i kodfragmentet beskrivs fullständigt i OpenID Connect-specifikationen. Observera att om du anger ett klientorganisations-ID i stället common
för {tenant} ovan resulterar det i klientspecifika URI:er i JSON-objektet som returneras.
{
"authorization_endpoint": "https://login.microsoftonline.com/{tenant}/oauth2/authorize",
"token_endpoint": "https://login.microsoftonline.com/{tenant}/oauth2/token",
"token_endpoint_auth_methods_supported":
[
"client_secret_post",
"private_key_jwt",
"client_secret_basic"
],
"jwks_uri": "https://login.microsoftonline.com/common/discovery/keys"
"userinfo_endpoint":"https://login.microsoftonline.com/{tenant}/openid/userinfo",
...
}
Om din app har anpassade signeringsnycklar till följd av att du använder funktionen för anspråksmappning måste du lägga till en appid
frågeparameter som innehåller app-ID:t för att få en jwks_uri
pekar på din apps signeringsnyckelinformation. Till exempel: https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration?appid=6731de76-14a6-49ae-97bc-6eba6914391e
innehåller en jwks_uri
av https://login.microsoftonline.com/{tenant}/discovery/keys?appid=6731de76-14a6-49ae-97bc-6eba6914391e
.
Skicka inloggningsbegäran
När webbprogrammet behöver autentisera användaren måste det dirigera användaren till /authorize
slutpunkten. Den här begäran liknar den första delen av OAuth 2.0-auktoriseringskodflödet, med några viktiga skillnader:
- Begäran måste innehålla omfånget
openid
i parameternscope
. - Parametern
response_type
måste innehållaid_token
. - Begäran måste innehålla parametern
nonce
.
Så en exempelbegäran skulle se ut så här:
// Line breaks for legibility only
GET https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=id_token
&redirect_uri=http%3A%2F%2Flocalhost%3a12345
&response_mode=form_post
&scope=openid
&state=12345
&nonce=7362CAEA-9CA5-4B43-9BA3-34D7C303EBA7
Parameter | Typ | Description |
---|---|---|
tenant | krävs | Värdet {tenant} i sökvägen för begäran kan användas för att styra vem som kan logga in på programmet. De tillåtna värdena är till exempel 8eaef023-2b34-4da1-9baa-8bc8c9d6a490 klientidentifierare eller contoso.onmicrosoft.com common för klientoberoende token |
client_id | krävs | Det program-ID som tilldelats din app när du registrerade det med Azure AD. Du hittar detta i Azure Portal. Klicka på Azure Active Directory, klicka på Appregistreringar, välj programmet och leta upp program-ID:t på programsidan. |
response_type | krävs | Måste inkluderas id_token för OpenID Connect-inloggning. Det kan också innehålla andra response_types, till exempel code eller token . |
omfång | Rekommenderas | OpenID Connect-specifikationen kräver omfånget openid , som översätts till behörigheten "Logga in dig" i användargränssnittet för medgivande. Den här och andra OIDC-omfång ignoreras på v1.0-slutpunkten, men är fortfarande bästa praxis för standardkompatibla klienter. |
Nonce | krävs | Ett värde som ingår i begäran, genererat av appen, som ingår i resultatet id_token som ett anspråk. Appen kan sedan verifiera det här värdet för att minimera tokenreprisattacker. Värdet är vanligtvis en slumpmässig, unik sträng eller GUID som kan användas för att identifiera begärans ursprung. |
redirect_uri | Rekommenderas | Appens redirect_uri, där autentiseringssvar kan skickas och tas emot av din app. Den måste exakt matcha en av de redirect_uris som du registrerade i portalen, förutom att den måste vara URL-kodad. Om det saknas skickas användaragenten tillbaka till en av de omdirigerings-URI:er som registrerats för appen slumpmässigt. Den maximala längden är 255 byte |
response_mode | valfri | Anger vilken metod som ska användas för att skicka den resulterande authorization_code tillbaka till din app. Värden som stöds är form_post för HTTP-formulärinlägg och fragment för URL-fragment. För webbprogram rekommenderar vi att du använder response_mode=form_post för att säkerställa den säkraste överföringen av token till ditt program. Standardvärdet för alla flöden inklusive en id_token är fragment . |
state | Rekommenderas | Ett värde som ingår i begäran som returneras i tokensvaret. Det kan vara en sträng med valfritt innehåll som du vill. Ett slumpmässigt genererat unikt värde används vanligtvis för att förhindra förfalskningsattacker mellan webbplatser. Tillståndet används också för att koda information om användarens tillstånd i appen innan autentiseringsbegäran inträffade, till exempel sidan eller vyn de var på. |
Snabb | valfri | Anger vilken typ av användarinteraktion som krävs. För närvarande är de enda giltiga värdena "login", "none" och "consent".
prompt=login tvingar användaren att ange sina autentiseringsuppgifter för den begäran och negera enkel inloggning.
prompt=none är motsatsen – det säkerställer att användaren inte får någon interaktiv fråga alls. Om begäran inte kan slutföras tyst via enkel inloggning returnerar slutpunkten ett fel.
prompt=consent utlöser dialogrutan OAuth-medgivande när användaren har loggat in och ber användaren att bevilja behörigheter till appen. |
login_hint | valfri | Kan användas för att i förväg fylla i fältet användarnamn/e-postadress på inloggningssidan för användaren, om du känner till användarnamnet i förväg. Appar använder ofta den här parametern under omautentiseringen, eftersom de redan har extraherat användarnamnet från en tidigare inloggning med anspråket preferred_username . |
Nu uppmanas användaren att ange sina autentiseringsuppgifter och slutföra autentiseringen.
Exempelsvar
Ett exempelsvar som skickas till angivet redirect_uri
i inloggningsbegäran när användaren har autentiserats kan se ut så här:
POST / HTTP/1.1
Host: localhost:12345
Content-Type: application/x-www-form-urlencoded
id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNB...&state=12345
Parameter | Beskrivning |
---|---|
id_token | Det id_token som appen begärde. Du kan använda id_token för att verifiera användarens identitet och starta en session med användaren. |
state | Ett värde som ingår i begäran som också returneras i tokensvaret. Ett slumpmässigt genererat unikt värde används vanligtvis för att förhindra förfalskningsattacker mellan webbplatser. Tillståndet används också för att koda information om användarens tillstånd i appen innan autentiseringsbegäran inträffade, till exempel sidan eller vyn de var på. |
Felsvar
Felsvar kan också skickas till så att redirect_uri
appen kan hantera dem på rätt sätt:
POST / HTTP/1.1
Host: localhost:12345
Content-Type: application/x-www-form-urlencoded
error=access_denied&error_description=the+user+canceled+the+authentication
Parameter | Beskrivning |
---|---|
fel | En felkodsträng som kan användas för att klassificera typer av fel som inträffar och som kan användas för att reagera på fel. |
error_description | Ett specifikt felmeddelande som kan hjälpa en utvecklare att identifiera rotorsaken till ett autentiseringsfel. |
Felkoder för auktoriseringsslutpunktsfel
I följande tabell beskrivs de olika felkoder som kan returneras i parametern error
för felsvaret.
Felkod | Description | Klientåtgärd |
---|---|---|
invalid_request | Protokollfel, till exempel en parameter som saknas. | Åtgärda och skicka begäran igen. Det här är ett utvecklingsfel och fångas vanligtvis upp under den första testningen. |
unauthorized_client | Klientprogrammet får inte begära en auktoriseringskod. | Detta inträffar vanligtvis när klientprogrammet inte är registrerat i Azure AD eller inte läggs till i användarens Azure AD klientorganisation. Programmet kan uppmana användaren att installera programmet och lägga till det i Azure AD. |
access_denied | Resursägaren nekade medgivande | Klientprogrammet kan meddela användaren att det inte kan fortsätta om inte användaren samtycker. |
unsupported_response_type | Auktoriseringsservern stöder inte svarstypen i begäran. | Åtgärda och skicka begäran igen. Det här är ett utvecklingsfel och fångas vanligtvis upp under den första testningen. |
server_error | Servern påträffade ett oväntat fel. | Försök igen med begäran. Dessa fel kan bero på tillfälliga villkor. Klientprogrammet kan förklara för användaren att svaret är försenat på grund av ett tillfälligt fel. |
temporarily_unavailable | Servern är tillfälligt för upptagen för att hantera begäran. | Försök igen med begäran. Klientprogrammet kan förklara för användaren att svaret är försenat på grund av ett tillfälligt villkor. |
invalid_resource | Målresursen är ogiltig eftersom den inte finns, Azure AD inte kan hitta den eller så är den inte korrekt konfigurerad. | Detta anger att resursen, om den finns, inte har konfigurerats i klientorganisationen. Programmet kan uppmana användaren att installera programmet och lägga till det i Azure AD. |
Verifiera id_token
Det räcker inte att bara ta emot en id_token
för att autentisera användaren. Du måste verifiera signaturen och verifiera anspråken id_token
enligt appens krav. Den Azure AD slutpunkten använder JSON-webbtoken (JWT) och kryptografi med offentlig nyckel för att signera token och kontrollera att de är giltiga.
Du kan välja att verifiera id_token
i klientkoden, men en vanlig metod är att skicka id_token
till en serverdelsserver och utföra verifieringen där.
Du kanske också vill verifiera ytterligare anspråk beroende på ditt scenario. Några vanliga valideringar är:
- Se till att användaren/organisationen har registrerat sig för appen.
- Se till att användaren har rätt auktorisering/behörigheter med hjälp av anspråken
wids
ellerroles
. - En viss autentiseringsstyrka har säkerställts, till exempel multifaktorautentisering.
När du har verifierat id_token
kan du starta en session med användaren och använda anspråken id_token
i för att hämta information om användaren i din app. Den här informationen kan användas för visning, poster, anpassning osv. Mer information om id_tokens
och anspråk finns i AAD-id_tokens.
Skicka en utloggningsbegäran
När du vill logga ut användaren från appen räcker det inte att rensa appens cookies eller avsluta sessionen med användaren på annat sätt. Du måste också omdirigera användaren till end_session_endpoint
för utloggning. Om du inte gör det kommer användaren att kunna autentisera till din app igen utan att ange sina autentiseringsuppgifter igen, eftersom de har en giltig session för enkel inloggning med Azure AD-slutpunkten.
Du kan helt enkelt omdirigera användaren till listan end_session_endpoint
i dokumentet OpenID Connect-metadata:
GET https://login.microsoftonline.com/common/oauth2/logout?
post_logout_redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
Parameter | Typ | Description |
---|---|---|
post_logout_redirect_uri | Rekommenderas | Den URL som användaren ska omdirigeras till efter att utloggningen har slutförts. Den här URL:en måste matcha en av de omdirigerings-URI:er som registrerats för ditt program i appregistreringsportalen. Om post_logout_redirect_uri inte ingår visas ett allmänt meddelande. |
Enkel utloggning
När du omdirigerar användaren till end_session_endpoint
rensar Azure AD användarens session från webbläsaren. Användaren kan dock fortfarande vara inloggad på andra program som använder Azure AD för autentisering. För att göra det möjligt för dessa program att logga ut användaren samtidigt skickar Azure AD en HTTP GET-begäran till den registrerade LogoutUrl
av alla program som användaren för närvarande är inloggad på. Program måste svara på den här begäran genom att rensa alla sessioner som identifierar användaren och returnerar ett 200
svar. Om du vill stödja enkel inloggning i ditt program måste du implementera en LogoutUrl
sådan i programmets kod. Du kan ange LogoutUrl
från Azure Portal:
- Logga in på Azure-portalen.
- Välj din Active Directory genom att klicka på ditt konto i det övre högra hörnet på sidan.
- Välj Azure Active Directory i den vänstra navigeringspanelen och välj sedan Appregistreringar och välj ditt program.
- Klicka på Inställningar och sedan på Egenskaper och leta reda på textrutan Utloggnings-URL .
Tokenförvärv
Många webbappar behöver inte bara logga in användaren, utan även få åtkomst till en webbtjänst för användarens räkning med hjälp av OAuth. Det här scenariot kombinerar OpenID Connect för användarautentisering samtidigt som du hämtar en authorization_code
som kan användas för att använda access_tokens
OAuth Authorization Code Flow.
Hämta åtkomsttoken
Om du vill hämta åtkomsttoken måste du ändra inloggningsbegäran ovan:
// Line breaks for legibility only
GET https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e // Your registered Application ID
&response_type=id_token+code
&redirect_uri=http%3A%2F%2Flocalhost%3a12345 // Your registered Redirect Uri, url encoded
&response_mode=form_post // `form_post' or 'fragment'
&scope=openid
&resource=https%3A%2F%2Fservice.contoso.com%2F // The identifier of the protected resource (web API) that your application needs access to
&state=12345 // Any value, provided by your app
&nonce=678910 // Any value, provided by your app
Genom att inkludera behörighetsomfång i begäran och med hjälp av response_type=code+id_token
ser authorize
slutpunkten till att användaren har samtyckt till de behörigheter som anges i scope
frågeparametern och returnerar appen en auktoriseringskod för att byta ut mot en åtkomsttoken.
Lyckat svar
Ett lyckat svar som skickas till med hjälp av redirect_uri
response_mode=form_post
ser ut så här:
POST /myapp/ HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNB...&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&state=12345
Parameter | Beskrivning |
---|---|
id_token | Den id_token app som begärdes. Du kan använda id_token för att verifiera användarens identitet och starta en session med användaren. |
kod | Den authorization_code som appen begärde. Appen kan använda auktoriseringskoden för att begära en åtkomsttoken för målresursen. Authorization_codes är kortvariga och upphör vanligtvis att gälla efter cirka 10 minuter. |
state | Om en tillståndsparameter ingår i begäran bör samma värde visas i svaret. Appen bör kontrollera att tillståndsvärdena i begäran och svaret är identiska. |
Felsvar
Felsvar kan också skickas till så att redirect_uri
appen kan hantera dem på rätt sätt:
POST /myapp/ HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
error=access_denied&error_description=the+user+canceled+the+authentication
Parameter | Beskrivning |
---|---|
fel | En felkodsträng som kan användas för att klassificera typer av fel som inträffar och som kan användas för att reagera på fel. |
error_description | Ett specifikt felmeddelande som kan hjälpa en utvecklare att identifiera rotorsaken till ett autentiseringsfel. |
En beskrivning av möjliga felkoder och deras rekommenderade klientåtgärd finns i Felkoder för auktoriseringsslutpunktsfel.
När du har fått en auktorisering code
och en id_token
kan du logga in användaren och få åtkomsttoken för deras räkning. Om du vill logga in användaren måste du verifiera exakt enligt beskrivningen id_token
ovan. Om du vill hämta åtkomsttoken kan du följa stegen som beskrivs i avsnittet "Använd auktoriseringskoden för att begära en åtkomsttoken" i vår OAuth-kodflödesdokumentation.
Nästa steg
- Läs mer om åtkomsttoken.
- Läs mer om anspråken
id_token
och .