Condividi tramite


Esercitazione: Configurare un'app Web ASP.NET Core per l'autorizzazione e l'autenticazione

Si applica a: Cerchio verde con un segno di spunta bianco. Tenant del personale Cerchio verde con un segno di spunta bianco. Tenant esterni (altre informazioni)

In questa esercitazione si aggiungono gli elementi di autenticazione e autorizzazione a un'app Web ASP.NET Core. Nell'esercitazione precedente è stato creato un progetto ASP.NET Core e configurato per l'autenticazione.

In questa esercitazione:

  • Aggiungere elementi di autorizzazione e autenticazione al codice
  • Abilitare la visualizzazione delle attestazioni in un token ID
  • Aggiungere le esperienze di accesso e disconnessione

Prerequisiti

Aggiungere elementi di autenticazione e autorizzazione

I file HomeController.cs e Program.cs devono essere modificati per aggiungere gli elementi di autenticazione e autorizzazione all'app Web ASP.NET Core. Ciò include la gestione della home page, l'aggiunta di namespace corretti e la configurazione dell'accesso.

Aggiungere l'autorizzazione a HomeController.cs

La home page dell'applicazione deve avere la possibilità di autorizzare l'utente. Lo spazio dei nomi Microsoft.AspNetCore.Authorization fornisce le classi e le interfacce per implementare l'autorizzazione per l'app Web. L'attributo [Authorize] viene usato per specificare che solo gli utenti autenticati possono usare l'app Web.

  1. Nell'app Web aprire Controllers/HomeController.cse aggiungere il frammento di codice seguente all'inizio del file:

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  2. Aggiungere l'attributo [Authorize] sopra la definizione della classe HomeController, come illustrato nel frammento di codice seguente:

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

Aggiungere elementi di autenticazione e autorizzazione a Program.cs

Il file Program.cs è il punto di ingresso dell'applicazione e deve essere modificato per aggiungere l'autenticazione e l'autorizzazione all'app Web. I servizi devono essere aggiunti per consentire all'app di usare le impostazioni definite in appsettings.json per l'autenticazione.

  1. Aggiungi i namespace seguenti all'inizio del file.

    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. Aggiungere quindi il servizio di autenticazione dell'app Web di Microsoft Identity, che configura l'app per l'uso di Microsoft Identity per l'autenticazione.

    // 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. Successivamente, il middleware deve essere configurato per abilitare le funzionalità di autenticazione. Sostituire il resto del codice con il frammento di codice seguente.

    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();
    

Aggiungere l'esperienza di accesso e disconnessione

L'interfaccia utente deve ricevere aggiornamenti per fornire una più user-friendly esperienza per l'accesso e la disconnessione. Questa sezione illustra come creare un nuovo file che visualizza gli elementi di navigazione in base allo stato di autenticazione dell'utente. Il codice legge le attestazioni del token ID per verificare che l'utente sia autenticato e usa User.Claims per estrarre le attestazioni del token ID.

  1. Creare un nuovo file in Views/Shared e assegnargli il nome _LoginPartial.cshtml.

  2. Aprire il file e aggiungere il codice seguente per implementare l'accesso e la disconnessione.

    @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. Aprire Views/Shared/_Layout.cshtml e aggiungere un riferimento a _LoginPartial creato nel passaggio precedente. Posizionare questa classe vicino alla fine della classe navbar-nav, come illustrato nel frammento di codice seguente:

    <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>
    

Usare un dominio URL personalizzato (facoltativo)

Si applica a: cerchio bianco con un simbolo X grigio. tenant dei lavoratori cerchio verde con un simbolo di spunta bianco. tenant esterni (ulteriori informazioni)

Usare un dominio personalizzato per personalizzare completamente l'URL di autenticazione. Dal punto di vista dell'utente, gli utenti rimangono nel dominio durante il processo di autenticazione, anziché essere reindirizzati al nome di dominio ciamlogin.com.

Seguire questa procedura per usare un dominio personalizzato:

  1. Usare la procedura descritta in Abilitare domini URL personalizzati per le app nei tenant esterni per abilitare il dominio URL personalizzato per il tenant esterno.

  2. Apri il file appsettings.json

    1. Aggiornare i parametri Instance e TenantId a una proprietà Authority.
    2. Aggiungere la stringa seguente al valore Authority fino a https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here. Sostituire Enter_the_Custom_Domain_Here con il dominio URL personalizzato e Enter_the_Tenant_ID_Here con l'ID tenant. Se non hai l'ID del tenant, scopri come leggere i dettagli del tenant.
    3. Aggiungere una proprietà knownAuthorities con il valore [Enter_the_Custom_Domain_Here].

Dopo aver apportato le modifiche al file di appsettings.json, se il dominio URL personalizzato è login.contoso.come l'ID tenant è aaaabbbbbb-0000-cccc-1111-dddd2222eeeee, il file dovrebbe essere simile al frammento di codice seguente:

{
  "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"]
    ...

Passaggio successivo