Partilhar via


Habilitar opções de autenticação em um aplicativo Web usando o Azure AD B2C

Importante

A partir de 1º de maio de 2025, o Azure AD B2C não estará mais disponível para compra para novos clientes. Saiba mais nas nossas Perguntas Frequentes.

Este artigo descreve como habilitar, personalizar e aprimorar a experiência de autenticação do Azure Ative Directory B2C (Azure AD B2C) para seu aplicativo Web.

Antes de começar, é importante familiarizar-se com os seguintes artigos:

Utilizar um domínio personalizado

Usando um domínio personalizado, você pode marcar totalmente a URL de autenticação. Do ponto de vista do usuário, os usuários permanecem no seu domínio durante o processo de autenticação, em vez de serem redirecionados para o nome de domínio b2clogin.com do Azure AD B2C.

Para remover todas as referências a "b2c" na URL, pode-se também substituir o nome do inquilino B2C, contoso.onmicrosoft.com, na URL do pedido de autenticação pelo GUID do ID do inquilino. Por exemplo, você pode alterar https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ para https://account.contosobank.co.uk/<tenant ID GUID>/.

Para usar um domínio personalizado e sua ID de locatário na URL de autenticação, siga as orientações em Habilitar domínios personalizados. Na pasta raiz do projeto, abra o arquivo appsettings.json . Este arquivo contém informações sobre seu provedor de identidade do Azure AD B2C.

No arquivo appsettings.json , faça o seguinte:

  • Atualize a entrada com seu Instance domínio personalizado.
  • Atualize a entrada com o ID do Domainlocatário. Para obter mais informações, consulte Usar ID de locatário.

O JSON a seguir mostra as configurações do aplicativo antes da alteração:

"AzureAdB2C": {
  "Instance": "https://contoso.b2clogin.com",
  "Domain": "tenant-name.onmicrosoft.com",
  ...
}

O JSON a seguir mostra as configurações do aplicativo após a alteração:

"AzureAdB2C": {
  "Instance": "https://login.contoso.com",
  "Domain": "00000000-0000-0000-0000-000000000000",
  ...
}

Suporte a cenários avançados

O AddMicrosoftIdentityWebAppAuthentication método na API da plataforma de identidade da Microsoft permite que os desenvolvedores adicionem código para cenários de autenticação avançada ou assinem eventos OpenIdConnect. Por exemplo, você pode assinar OnRedirectToIdentityProvider, que permite personalizar a solicitação de autenticação que seu aplicativo envia ao Azure AD B2C.

Para suportar cenários avançados, abra o arquivo Startup.cs e, na função, substitua ConfigureServicesAddMicrosoftIdentityWebAppAuthentication pelo seguinte trecho de código:

// Configuration to sign-in users with Azure AD B2C

//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
{
    Configuration.Bind("AzureAdB2C", options);
    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});

O código anterior adiciona o evento OnRedirectToIdentityProvider com uma referência ao OnRedirectToIdentityProviderFunc método. Adicione o seguinte trecho de Startup.cs código à classe.

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Custom code here
    
    // Don't remove this line
    await Task.CompletedTask.ConfigureAwait(false);
}

Você pode passar parâmetros entre o controlador e a função usando parâmetros de OnRedirectToIdentityProvider contexto.

Preencher automaticamente o nome de início de sessão

Durante um processo de login, o seu aplicativo pode destinar-se a um utilizador específico. Quando um aplicativo tem como alvo um usuário, ele pode especificar na solicitação de autorização o login_hint parâmetro de consulta com o nome de entrada do usuário. O Azure AD B2C preenche automaticamente o nome de entrada e o usuário precisa fornecer apenas a senha.

Para preencher previamente o nome de utilizador, faça o seguinte:

  1. Se você estiver usando uma política personalizada, adicione a declaração de entrada necessária, conforme descrito em Configurar entrada direta.

  2. Conclua o procedimento de cenários avançados de suporte .

  3. Adicione a seguinte linha de código à OnRedirectToIdentityProvider função:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.LoginHint = "emily@contoso.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Pré-selecionar um provedor de identidade

Se você configurou a jornada de entrada para seu aplicativo para incluir contas sociais, como Facebook, LinkedIn ou Google, você pode especificar o domain_hint parâmetro. Este parâmetro de consulta fornece uma dica para o Azure AD B2C sobre o provedor de identidade social que deve ser usado para entrar. Por exemplo, se o aplicativo especificar domain_hint=facebook.com, o fluxo de entrada vai diretamente para a página de entrada do Facebook.

Para redirecionar os usuários para um provedor de identidade externo, faça o seguinte:

  1. Verifique o nome de domínio do seu provedor de identidade externo. Para obter mais informações, consulte Redirecionar o login para um provedor social.

  2. Conclua o procedimento de cenários avançados de suporte .

  3. OnRedirectToIdentityProviderFunc Na função, adicione a seguinte linha de código à OnRedirectToIdentityProvider função:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.DomainHint = "facebook.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Especificar o idioma da interface do usuário

A personalização de idioma no Azure AD B2C permite que seu fluxo de usuário acomode uma variedade de idiomas para atender às necessidades de seus clientes. Para obter mais informações, consulte Personalização de idioma.

Para definir o idioma preferido, faça o seguinte:

  1. Configure a personalização do idioma.

  2. Conclua o procedimento de cenários avançados de suporte .

  3. Adicione a seguinte linha de código à OnRedirectToIdentityProvider função:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.UiLocales = "es";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Passar um parâmetro de cadeia de caracteres de consulta personalizado

Com políticas personalizadas, você pode passar um parâmetro de cadeia de caracteres de consulta personalizado. Um bom exemplo de caso de uso é quando você deseja alterar dinamicamente o conteúdo da página.

Para passar um parâmetro de cadeia de caracteres de consulta personalizado, faça o seguinte:

  1. Configure o elemento ContentDefinitionParameters .

  2. Conclua o procedimento de cenários avançados de suporte .

  3. Adicione a seguinte linha de código à OnRedirectToIdentityProvider função:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.Parameters.Add("campaignId", "123");
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Fornecer uma sugestão de token de ID

Um aplicativo de terceira parte confiável pode enviar um JSON Web Token (JWT) de entrada como parte da solicitação de autorização OAuth2. O token de entrada é uma dica sobre o usuário ou a solicitação de autorização. O Azure AD B2C valida o token e, em seguida, extrai a declaração.

Para incluir uma dica de token de ID na solicitação de autenticação, faça o seguinte:

  1. Conclua o procedimento de cenários avançados de suporte .

  2. Em sua política personalizada, defina um perfil técnico de dica de token de ID.

  3. Adicione a seguinte linha de código à OnRedirectToIdentityProvider função:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      // The idTokenHint variable holds your ID token 
      context.ProtocolMessage.IdTokenHint = idTokenHint
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

Controlador de conta

Se você quiser personalizar as ações de Entrada, Inscrição ou Saída , recomendamos que você crie seu próprio controlador. Ter seu próprio controlador permite que você passe parâmetros entre seu controlador e a biblioteca de autenticação. AccountController faz parte do pacote NuGet, que lida com as ações de Microsoft.Identity.Web.UI entrada e saída. Você pode encontrar sua implementação na biblioteca da Web do Microsoft Identity.

Adicionar o controlador de conta

Em seu projeto do Visual Studio, clique com o botão direito do mouse na pasta controladores e, em seguida, adicione um novo controlador. Selecione MVC - Empty Controller e forneça o nome MyAccountController.cs.

O trecho de código a seguir demonstra um costume MyAccountController com a ação Entrar .

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;


namespace mywebapp.Controllers
{
    [AllowAnonymous]
    [Area("MicrosoftIdentity")]
    [Route("[area]/[controller]/[action]")]
    public class MyAccountController : Controller
    {

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme)
        {
            scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
            var redirectUrl = Url.Content("~/");
            var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
            return Challenge(properties, scheme);
        }

    }
}

Na vista _LoginPartial.cshtml , altere a ligação de início de sessão para o controlador.

<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">

Passar a ID de política do Azure AD B2C

O trecho de código a seguir demonstra um costume MyAccountController com a ação Entrar e Inscrição . A ação passa um parâmetro chamado policy para a biblioteca de autenticação. Isso permite que você forneça a ID de política do Azure AD B2C correta para a ação específica.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    return Challenge(properties, scheme);
}

public IActionResult SignUp([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignUp";
    return Challenge(properties, scheme);
}

Na visualização _LoginPartial.cshtml , altere o asp-controller valor para MyAccountController quaisquer outros links de autenticação, como inscrição ou editar perfil.

Passar parâmetros personalizados

O trecho de código a seguir demonstra um costume MyAccountController com a ação Entrar . A ação passa um parâmetro chamado campaign_id para a biblioteca de autenticação.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    properties.Items["campaign_id"] = "1234";
    return Challenge(properties, scheme);
}

Conclua o procedimento de cenários avançados de suporte e, em seguida, no método, leia o OnRedirectToIdentityProvider parâmetro personalizado:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Read the custom parameter
    var campaign_id = context.Properties.Items.FirstOrDefault(x => x.Key == "campaign_id").Value;

    // Add your custom code here
    if (campaign_id != null)
    {
        // Send parameter to authentication request
        context.ProtocolMessage.SetParameter("campaign_id", campaign_id);
    }
    
    await Task.CompletedTask.ConfigureAwait(false);
}

Proteja o redirecionamento de logout

Após o logout, o usuário é redirecionado para o URI especificado no post_logout_redirect_uri parâmetro, independentemente das URLs de resposta especificadas para o aplicativo. No entanto, se um válido id_token_hint for passado e o Exigir Token de ID em solicitações de logout estiver ativado, o Azure AD B2C verificará se o valor de post_logout_redirect_uri corresponde a um dos URIs de redirecionamento configurados do aplicativo antes de executar o redirecionamento. Se nenhuma URL de resposta correspondente foi configurada para o aplicativo, uma mensagem de erro é exibida e o usuário não é redirecionado.

Para oferecer suporte a um redirecionamento de logout seguro em seu aplicativo, primeiro siga as etapas nas seções Controlador de conta e Cenários avançados de suporte . Em seguida, siga os passos abaixo:

  1. No MyAccountController.cs controlador, adicione uma ação de Saída usando o seguinte trecho de código:

    [HttpGet("{scheme?}")]
    public async Task<IActionResult> SignOutAsync([FromRoute] string scheme)
    {
        scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    
        //obtain the id_token
        var idToken = await HttpContext.GetTokenAsync("id_token");
        //send the id_token value to the authentication middleware
        properties.Items["id_token_hint"] = idToken;            
    
        return SignOut(properties,CookieAuthenticationDefaults.AuthenticationScheme,scheme);
    }
    
  2. Na classe Startup.cs , analise o id_token_hint valor e acrescente o valor à solicitação de autenticação. O trecho de código a seguir demonstra como passar o id_token_hint valor para a solicitação de autenticação:

    private async Task OnRedirectToIdentityProviderForSignOutFunc(RedirectContext context)
    {
        var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value;
        if (id_token_hint != null)
        {
            // Send parameter to authentication request
            context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint);
        }
    
        await Task.CompletedTask.ConfigureAwait(false);
    }
    
  3. ConfigureServices Na função, adicione a SaveTokens opção para que os controladores tenham acesso ao id_token valor:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. No arquivo de configuraçãoappsettings.json , adicione o caminho URI de redirecionamento de logout para a SignedOutCallbackPath chave.

    "AzureAdB2C": {
      "Instance": "https://<your-tenant-name>.b2clogin.com",
      "ClientId": "<web-app-application-id>",
      "Domain": "<your-b2c-domain>",
      "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
      "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
    }
    

No exemplo acima, o post_logout_redirect_uri passado para a solicitação de logout estará no formato: https://your-app.com/signout/<your-sign-up-in-policy>. Este URL tem de ser adicionado ao URL de resposta do Registo de Aplicação.

Controle de acesso baseado em funções

Com a autorização no ASP.NET Core , você pode verificar se os usuários estão autorizados a acessar um recurso protegido usando um dos seguintes métodos:

ConfigureServices No método, adicione o AddAuthorization método, que adiciona o modelo de autorização. O exemplo a seguir cria uma política chamada EmployeeOnly. A política verifica se existe uma declaração EmployeeNumber . O valor da reivindicação deve ser um dos seguintes IDs: 1, 2, 3, 4 ou 5.

services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy =>
              policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });

Você controla a autorização no ASP.NET Core usando AuthorizeAttribute e seus vários parâmetros. Em sua forma mais básica, aplicar o atributo a um controlador, ação ou Razor Page limita o Authorize acesso aos usuários autenticados desse componente.

Você aplica políticas aos controladores usando o Authorize atributo com o nome da política. O código a seguir limita o Claims acesso à ação aos usuários autorizados pela EmployeeOnly política:

[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
    return View();
}

Próximos passos