Dela via


Självstudie: Konfigurera en ASP.NET Core-webbapp för auktorisering och autentisering

Gäller för: Grön cirkel med en vit bockmarkeringssymbol som anger att följande innehåll gäller för personalklienter.Personalklienter Grön cirkel med en vit bockmarkeringssymbol som anger att följande innehåll gäller för externa klienter. Externa klienter (läs mer)

I den här självstudien lägger du till autentiserings- och auktoriseringselementen i en ASP.NET Core-webbapp. I den tidigare handledningenskapade du ett ASP.NET Core-projekt och konfigurerade det för autentisering.

I den här handledningen kommer du att:

  • Lägga till auktoriserings- och autentiseringselement i koden
  • Aktivera visning av anspråk i ett ID-token
  • Lägg till inloggnings- och utloggningsfunktionerna

Förutsättningar

Lägga till autentiserings- och auktoriseringselement

HomeController.cs- och Program.cs-filerna måste ändras för att lägga till autentiserings- och auktoriseringselementen i ASP.NET Core-webbappen. Detta inkluderar att hantera startsidan, lägga till rätt namnområden och konfigurera inloggning.

Lägg till auktorisering i HomeController.cs

Startsidan för programmet måste ha möjlighet att auktorisera användaren. Microsoft.AspNetCore.Authorization-namnområdet innehåller klasser och gränssnitt för att implementera auktorisering till webbappen. Attributet [Authorize] används för att ange att endast autentiserade användare kan använda webbappen.

  1. Öppna Controllers/HomeController.csi webbappen och lägg till följande kodfragment överst i filen:

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  2. Lägg till attributet [Authorize] ovanför HomeController-klassdefinitionen, enligt följande kodfragment:

    [Authorize]
    public class HomeController : Controller
    {
    ...
    

Lägga till autentiserings- och auktoriseringselement i Program.cs

Den Program.cs filen är startpunkten för programmet och måste ändras för att lägga till autentisering och auktorisering i webbappen. Tjänster måste läggas till för att appen ska kunna använda de inställningar som definierats i appsettings.json för autentisering.

  1. Lägg till följande namnområden överst i filen.

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc.Authorization;
    using Microsoft.Identity.Web;
    using Microsoft.Identity.Web.UI;
    using System.IdentityModel.Tokens.Jwt;
    
  2. Lägg sedan till autentiseringstjänsten för Microsoft Identity Web-appen, som konfigurerar appen så att den använder Microsoft Identity för autentisering.

    // Add services to the container.
    builder.Services.AddControllersWithViews();
    
    // This is required to be instantiated before the OpenIdConnectOptions starts getting configured.
    // By default, the claims mapping will map claim names in the old format to accommodate older SAML applications.
    // This flag ensures that the ClaimsIdentity claims collection will be built from the claims in the token
    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
    
    // Sign-in users with the Microsoft identity platform
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration)
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();
    
    builder.Services.AddControllersWithViews(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    }).AddMicrosoftIdentityUI();
    
    
  3. Därefter måste mellanprogrammet konfigureras för att aktivera autentiseringsfunktionerna. Ersätt resten av koden med följande kodfragment.

    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    app.UseAuthorization();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    

Lägg till inloggnings- och utloggningsupplevelsen

Användargränssnittet måste uppdateras för att ge en mer användarvänlig upplevelse för inloggning och utloggning. Det här avsnittet visar hur du skapar en ny fil som visar navigeringselement baserat på användarens autentiseringsstatus. Koden läser ID-tokenanspråken för att kontrollera att användaren är autentiserad och använder User.Claims för att extrahera ID-tokenanspråk.

  1. Skapa en ny fil i Views/Shared och ge den namnet _LoginPartial.cshtml.

  2. Öppna filen och lägg till följande kod för att lägga till inloggnings- och utloggningsupplevelsen:

    @using System.Security.Principal
    
    <ul class="navbar-nav">
    @if (User.Identity is not null && User.Identity.IsAuthenticated)
    {
            <li class="nav-item">
                <span class="nav-link text-dark">Hello @User.Claims.First(c => c.Type == "preferred_username").Value!</span>
            </li>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign out</a>
            </li>
    }
    else
    {
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign in</a>
            </li>
    }
    </ul>
    
  3. Öppna Views/Shared/_Layout.cshtml och lägg till en referens till _LoginPartial som skapades i föregående steg. Placera detta i slutet av klassen navbar-nav enligt följande kodfragment:

    <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
            </li>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
            </li>
        </ul>
        <partial name="_LoginPartial" />
    </div>
    

Använda anpassad URL-domän (valfritt)

Gäller för: Grön cirkel med en vit bockmarkeringssymbol som anger att följande innehåll gäller för externa klienter. Externa klienter (läs mer)

Använd en anpassad domän för att helt märka autentiserings-URL:en. Från ett användarperspektiv finns användarna kvar på din domän under autentiseringsprocessen, i stället för att omdirigeras till ciamlogin.com domännamn.

Följ dessa steg för att använda en anpassad domän:

  1. Använd stegen i Aktivera anpassade URL-domäner för appar i externa klienter för att aktivera anpassad URL-domän för din externa klientorganisation.

  2. Öppna appsettings.json fil:

    1. Uppdatera parametrarna Instance och TenantId till en Authority egenskap.
    2. Lägg till följande sträng i värdet Authority i https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here. Ersätt Enter_the_Custom_Domain_Here med din anpassade URL-domän och Enter_the_Tenant_ID_Here med ditt klient-ID. Om du inte har ditt klient-ID, ta reda på hur du kan läsa klientinformationen.
    3. Lägg till en knownAuthorities-egenskap med värdet [Enter_the_Custom_Domain_Here].

När du har gjort ändringarna i din appsettings.json-fil, om din anpassade URL-domän är login.contoso.comoch klientorganisations-ID:t är aaaabbbb-0000-cccc-1111-dddd222eeee, bör filen se ut ungefär som följande kodfragment:

{
  "AzureAd": {
    "Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "ClientId": "Enter_the_Application_Id_Here",
    "ClientCertificates": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateThumbprint": "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"
      }   
    ],
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-callback-oidc",
    "KnownAuthorities": ["login.contoso.com"]
    ...

Nästa steg