Compartilhar via


Tutorial: Configurar um aplicativo Web ASP.NET Core para autorização e autenticação

Aplica-se a: Círculo verde com um símbolo de marca de seleção branco. Locatários da força de trabalho Círculo verde com símbolo de marca de seleção branca. Locatários externos (saiba mais)

Neste tutorial, você adicionará os elementos de autenticação e autorização a um aplicativo Web ASP.NET Core. No tutorial anterior, você criou um projeto do ASP.NET Core e o configurou para autenticação.

Neste tutorial, você:

  • Adicionar elementos de autorização e autenticação ao código
  • Habilitar a exibição de declarações em um token de ID
  • Adicione as experiências de entrada e saída

Pré-requisitos

Adicionar elementos de autenticação e autorização

Os arquivos HomeController.cs e Program.cs precisam ser modificados para adicionar os elementos de autenticação e autorização ao aplicativo Web ASP.NET Core. Isso inclui o gerenciamento da página inicial, a adição de namespaces corretos e a configuração do login.

Adicionar autorização a HomeController.cs

A home page do aplicativo precisa ter a capacidade de autorizar o usuário. O Microsoft.AspNetCore.Authorization namespace fornece as classes e interfaces para implementar a autorização para o aplicativo Web. O [Authorize] atributo é usado para especificar que somente usuários autenticados podem usar o aplicativo Web.

  1. Em seu aplicativo Web, abra Controladores/HomeController.cs e adicione o seguinte snippet à parte superior do arquivo:

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  2. Adicione o [Authorize] atributo acima da definição de HomeController classe, conforme mostrado no snippet a seguir:

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

Adicionar elementos de autenticação e autorização a Program.cs

O arquivo Program.cs é o ponto de entrada do aplicativo e precisa ser modificado para adicionar autenticação e autorização ao aplicativo Web. Os serviços precisam ser adicionados para permitir que o aplicativo use as configurações definidas em appsettings.json para autenticação.

  1. Adicione os namespaces a seguir à parte superior do arquivo.

    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. Em seguida, adicione o serviço de autenticação de aplicativo Web do Microsoft Identity, que configura o aplicativo para usar o Microsoft Identity para autenticação.

    // 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. Em seguida, o middleware precisa ser configurado para habilitar os recursos de autenticação. Substitua o restante do código pelo snippet a seguir.

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

Adicione a experiência de entrada e saída

A interface do usuário precisa ser atualizada para fornecer uma experiência mais amigável para entrar e sair. Esta seção mostra como criar um novo arquivo que exibe itens de navegação com base no status de autenticação do usuário. O código lê as declarações do token de ID para verificar se o usuário está autenticado e usa User.Claims para extrair as declarações do token de ID.

  1. Crie um novo arquivo em Exibições/Compartilhado e dê a ele o nome _LoginPartial.cshtml.

  2. Abra o arquivo e adicione o seguinte código para adicionar a experiência de entrada e saída:

    @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. Abra Views/Shared/_Layout.cshtml e adicione uma referência a _LoginPartial criada na etapa anterior. Coloque isso perto do final da navbar-nav classe, conforme mostrado no seguinte snippet:

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

Usar domínio de URL personalizado (opcional)

Aplica-se a: Círculo branco com um símbolo X cinza. Locatários de força de trabalho Círculo verde com um símbolo de visto branco. Locatários externos (saiba mais)

Use um domínio personalizado para marcar totalmente a URL de autenticação. Do ponto de vista do usuário, os usuários permanecem em seu domínio durante o processo de autenticação, em vez de serem redirecionados para o nome de domínio ciamlogin.com .

Siga estas etapas para usar um domínio personalizado:

  1. Use as etapas mencionadas em Habilitar domínios de URL personalizados para aplicativos de locatários externos para habilitar domínios de URL personalizados para seu locatário externo.

  2. Abra appsettings.json arquivo:

    1. Atualize os parâmetros Instance e TenantId para uma propriedade Authority.
    2. Adicione a seguinte cadeia de caracteres ao valor de Authority para https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here. Substitua Enter_the_Custom_Domain_Here pelo domínio de URL personalizado e Enter_the_Tenant_ID_Here pela ID do locatário. Se você não tiver sua ID de locatário, saiba como ler os detalhes do locatário.
    3. Adicione uma knownAuthorities propriedade com um valor [Enter_the_Custom_Domain_Here].

Depois de fazer as alterações no arquivo appsettings.json, se o domínio de URL personalizado for login.contoso.com e sua ID de locatário for aaaabbbb-0000-cccc-1111-dddd2222eeee, o arquivo deverá ser semelhante ao seguinte trecho de código:

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

Próxima etapa