Autentisera med Azure AD och OpenID Anslut
Programmet Surveys använder OIDC-protokollet (OpenID Anslut) för att autentisera användare med Azure Active Directory (Azure AD). Programmet Surveys använder ASP.NET Core, som har inbyggd mellanprogram för OIDC. Följande diagram visar vad som händer när användaren loggar in på en hög nivå.

- Användaren klickar på knappen "logga in" i appen. Den här åtgärden hanteras av en MVC-styrenhet.
- MVC-kontrollanten returnerar en ChallengeResult-åtgärd.
- Mellanprogram fångar upp ChallengeResult och skapar ett 302-svar som omdirigerar användaren till inloggningssidan för Azure AD.
- Användaren autentiseras med Azure AD.
- Azure AD skickar en ID-token till programmet.
- Mellanprogram validerar ID-token. Nu autentiseras användaren i programmet.
- Mellanprogrammet omdirigerar användaren tillbaka till programmet.
Registrera appen med Azure AD
Om du vill Anslut OpenID registrerar SaaS-providern programmet i sin egen Azure AD-klientorganisation.
Registrera programmet genom att följa stegen i Snabbstart: Registrera ett program med Microsofts identitetsplattform.
Om du vill aktivera den här funktionen i exempelprogrammet Surveys kan du läsa GitHub readme. . Tänk på följande:
För ett program med flera olika program måste du uttryckligen konfigurera alternativet med flera olika program. Detta gör att andra organisationer kan komma åt programmet.
Svars-URL:en är den URL där Azure AD skickar OAuth 2.0-svar. När du använder ASP.NET Core måste detta matcha sökvägen som du konfigurerar i autentiseringens mellanprogram (se nästa avsnitt).
Konfigurera auth middleware
I det här avsnittet beskrivs hur du konfigurerar mellanprogram för autentisering i ASP.NET Core för multitenant-autentisering med OpenID-Anslut.
I startklassen läggerdu till OpenID-Anslut mellanprogram:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(
options =>
{
Configuration.Bind("AzureAd", options);
options.Events = new SurveyAuthenticationEvents(loggerFactory);
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.Events.OnTokenValidated += options.Events.TokenValidated;
})
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamWebApi(configOptions.SurveyApi.Name, Configuration.GetSection("SurveyApi"))
.AddDistributedTokenCaches();
Observera att några av inställningarna finns i filen secrets.json. Filen måste ha ett avsnitt med namnet AzureAd med följande inställningar:
- Instans. För ett program med flera olika program anger du detta till
https://login.microsoftonline.com. Det här är URL:en för den gemensamma Azure AD-slutpunkten, som gör det möjligt för användare från valfri Azure AD-klient att logga in. - ClientId. Programmets klient-ID, som du fick när du registrerade programmet i Azure AD.
- TenantId. GUID för att logga in användare i din organisation.
Det här är vad de andra alternativen för mellanprogram innebär:
- SignInScheme. Ställ in på
CookieAuthenticationDefaults.AuthenticationScheme. Den här inställningen innebär att när användaren har autentiserats lagras användargränssnittet lokalt i en cookie. Den här cookien är hur användaren förblir inloggad under webbläsarsessionen. - Händelser. Återanrop av händelser; se Autentiseringshändelser.
Initiera autentiseringsflödet
Om du vill starta autentiseringsflödet i ASP.NET MVC returnerar du ett ChallengeResult från kontrollanten:
[AllowAnonymous]
public IActionResult SignIn()
{
return new ChallengeResult(
OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties
{
IsPersistent = true,
RedirectUri = Url.Action("SignInCallback", "Account")
});
}
Detta gör att mellanprogram returnerar ett 302-svar (hittades) som omdirigerar till autentiseringsslutpunkten.
Användarinloggningssessioner
När användaren loggar in skriver mellanprogram för cookieautentisering användarens anspråk till en cookie. Därefter autentiseras HTTP-begäranden genom att läsa cookien.
Som standard skriver cookie-mellanprogram en sessionscookie, som tas bort när användaren stänger webbläsaren. Nästa gång användaren besöker webbplatsen måste han eller hon logga in igen. Men om du anger IsPersistent till true i ChallengeResultskriver mellanprogram en beständig cookie, så att användaren förblir inloggad när webbläsaren har stängts. Du kan konfigurera förfallotid för cookien. se Kontrollera cookiealternativ. Beständiga cookies är mer praktiska för användaren, men kan vara olämpliga för vissa program (till exempel ett bankprogram) där du vill att användaren ska logga in varje gång.
Om OpenID-Anslut mellanprogram
OpenID-Anslut mellanprogram i ASP.NET döljer det mesta av protokollinformationen. Det här avsnittet innehåller några kommentarer om implementeringen, som kan vara användbart för att förstå protokollflödet.
Först undersöker vi autentiseringsflödet i termer av ASP.NET (ignorerar informationen om OIDC-protokollflödet mellan appen och Azure AD). I följande diagram visas processen.

I det här diagrammet finns det två MVC-styrenheter. Kontokontrollanten hanterar inloggningsförfrågningar och startkontrollanten hanterar startsidan.
Här är autentiseringsprocessen:
- Användaren klickar på knappen "Logga in" och webbläsaren skickar en GET-begäran. Exempel:
GET /Account/SignIn/. - Kontokontrollanten returnerar
ChallengeResulten . - OIDC-mellanprogram returnerar ett HTTP 302-svar som omdirigeras till Azure AD.
- Webbläsaren skickar autentiseringsbegäran till Azure AD
- Användaren loggar in på Azure AD och Azure AD skickar tillbaka ett autentiseringssvar.
- OIDC-mellanprogram skapar ett anspråksobjekt och skickar det till mellanprogram för cookieautentisering.
- Cookie-mellanprogram serialiserar anspråkens huvudnamn och anger en cookie.
- OIDC-mellanprogrammet omdirigerar till programmets återanrops-URL.
- Webbläsaren följer omdirigeringen och skickar cookien i begäran.
- Cookiens mellanprogram deserialiserar cookien till ett anspråksobjekt och anger
HttpContext.Useratt den motsvarar anspråkshuvudbeloppet. Begäran dirigeras till en MVC-styrenhet.
Autentiseringsbiljett
Om autentiseringen lyckas skapar OIDC-mellanprogram en autentiseringsbiljett som innehåller ett anspråksobjekt som innehåller användarens anspråk.
Anteckning
Tills hela autentiseringsflödet har slutförts innehåller HttpContext.User fortfarande ett anonymt huvudnamn, HttpContext.User den autentiserade användaren. Det anonyma huvudbeloppet har en tom anspråkssamling. När autentiseringen är klar och appen omdirigeras deserialiserar cookie-mellanprogrammet autentiseringscookien och ställer in den på ett anspråksobjekt som representerar den HttpContext.User autentiserade användaren.
Autentiseringshändelser
Under autentiseringsprocessen träffar OpenID-Anslut mellanprogram en serie händelser:
- RedirectToIdentityProvider. Anropas direkt innan mellanprogram omdirigeras till autentiseringsslutpunkten. Du kan använda den här händelsen för att ändra omdirigerings-URL:en. till exempel för att lägga till begärandeparametrar. Ett exempel finns i Lägga till prompten för administratörsmedgivande.
- AuthorizationCodeReceived. Anropas med auktoriseringskoden.
- TokenResponseReceived. Anropas när mellanprogram hämtar en åtkomsttoken från IDP:en, men innan den verifieras. Gäller endast för auktoriseringskodflöde.
- TokenValidated. Anropas när mellanprogram verifierar ID-token. Nu har programmet en uppsättning verifierade anspråk om användaren. Du kan använda den här händelsen för att utföra ytterligare verifiering av anspråken eller omvandla anspråk. Se Arbeta med anspråk.
- UserInformationReceived. Anropas om mellanprogram hämtar användarprofilen från slutpunkten för användarinformation. Gäller endast för auktoriseringskodflöde och endast
GetClaimsFromUserInfoEndpoint = truei mellanprogramsalternativen. - TicketReceived. Anropas när autentiseringen har slutförts. Det här är den sista händelsen, förutsatt att autentiseringen lyckas. När den här händelsen har hanterats loggas användaren in i appen.
- AuthenticationFailed. Anropas om autentiseringen misslyckas. Använd den här händelsen för att hantera autentiseringsfel – till exempel genom att omdirigera till en felsida.
Om du vill ge återanrop för dessa händelser anger du alternativet Händelser för mellanprogram. Det finns två olika sätt att deklarera händelsehanterare: infogade med lambdas eller i en klass som härleds från OpenIdConnectEvents. Den andra metoden rekommenderas om dina händelseanrop har någon betydande logik, så att de inte gör startklassen rörig. Vår referensimplementering använder den här metoden.
OpenID Anslut slutpunkter
Azure AD stöder OpenID Anslut Discovery, där identitetsprovidern (IDP) returnerar ett JSON-metadatadokument från en välkänd slutpunkt. Metadatadokumentet innehåller information som:
- URL:en för auktoriseringsslutpunkten. Det är här appen omdirigeras för att autentisera användaren.
- WEBBADRESSen till slutpunkten för "slutsessionen", där appen går för att logga ut användaren.
- URL:en för att hämta signeringsnycklarna, som klienten använder för att verifiera de OIDC-token som den hämtar från IDP:n.
Som standard vet OIDC-mellanprogram hur dessa metadata ska hämtas. Ange alternativet Auktoritet i mellanprogram, så konstruerar mellanprogram URL:en för metadata. (Du kan åsidosätta metadata-URL:en genom att ange alternativet MetadataAddress.)
OpenID Anslut flöden
Som standard använder OIDC-mellanprogram hybridflöde med formulär efter svar-läge.
- Hybridflöde innebär att klienten kan hämta en ID-token och en auktoriseringskod i samma tur och retur till auktoriseringsservern.
- Formulär efter svar-läge innebär att auktoriseringsservern använder en HTTP POST-begäran för att skicka ID-token och auktoriseringskoden till appen. Värdena är form-urlencoded (innehållstyp = "application/x-www-form-urlencoded").
När OIDC-mellanprogram omdirigeras till auktoriseringsslutpunkten innehåller omdirigerings-URL:en alla frågesträngsparametrar som krävs av OIDC. För hybridflöde:
- client_id. Det här värdet anges i alternativet ClientId.
- scope = "openid profile", vilket innebär att det är en OIDC-begäran och vi vill ha användarens profil.
- response_type = "code id_token". Detta anger hybridflöde.
- response_mode = "form_post". Detta anger formulär efter svar.
Om du vill ange ett annat flöde anger du egenskapen ResponseType för alternativen.
app.AddAuthentication().AddOpenIdConnect(options =>
{
options.ResponseType = "code"; // Authorization code flow
// Other options
}
Exempelkod