Compartilhar 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 em nossas perguntas frequentes.

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

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

Usar 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 em seu domínio durante o processo de autenticação, em vez de serem redirecionados para o Azure AD B2C b2clogin.com nome de domínio.

Para remover todas as referências a “b2c” no URL, você também pode substituir o nome do locatário b2c, contoso.onmicrosoft.com, no URL de solicitação de autenticação pelo GUID da ID do locatário. 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 diretrizes em Habilitar domínios personalizados. Na pasta raiz do projeto, abra o arquivo appsettings.json. Este arquivo contém informações sobre o provedor de identidade do Azure AD B2C.

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

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",
  ...
}

Dar 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 avançados de autenticação ou assinem eventos OpenIdConnect. Por exemplo, você pode assinar o OnRedirectToIdentityProvider, que permite personalizar a solicitação de autenticação que seu aplicativo envia ao Azure AD B2C.

Para dar suporte a cenários avançados, abra o arquivo Startup.cs e, na ConfigureServices função, substitua AddMicrosoftIdentityWebAppAuthentication pelo seguinte snippet 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 snippet de código a seguir à Startup.cs 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 OnRedirectToIdentityProvider função usando parâmetros de contexto.

Preencher previamente o nome de usuário

Durante uma jornada de sign-in do usuário, seu aplicativo pode focar em um usuário específico. Quando um aplicativo tem como destino 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 o nome de logon, 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 conexão 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 o percurso de entrada do aplicativo para incluir contas sociais, como Facebook, LinkedIn ou Google, poderá especificar o domain_hint parâmetro. Esse 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 usuários para um provedor de identidade externo, faça o seguinte:

  1. Verifique o nome de domínio do 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 idiomas no Azure AD B2C permite que seu fluxo de usuário acomode uma variedade de idiomas para atender às necessidades dos clientes. Para obter mais informações, consulte Personalização de idioma.

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

  1. Configurar 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 personalizada, 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);
    }
    

Passar uma dica de token de ID

Um aplicativo de terceira parte confiável pode enviar um JWT (Token Web JSON) 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 SignIn, SignUp ou SignOut , recomendamos que você crie seu próprio controlador. Ter seu próprio controlador permite que você passe parâmetros entre o controlador e a biblioteca de autenticação. AccountController faz parte do Microsoft.Identity.Web.UI pacote NuGet, que manipula as ações de entrada e saída. Você pode encontrar sua implementação na biblioteca da Web de Identidade da Microsoft.

Adicionar o controlador de conta

No projeto do Visual Studio, clique com o botão direito do mouse na pasta Controladores e adicione um novo Controlador. Selecione MVC – Controlador Vazio e forneça o nome MyAccountController.cs.

O snippet de código a seguir demonstra um personalizado MyAccountController com a ação SignIn .

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

    }
}

No modo de exibição _LoginPartial.cshtml , altere o link de entrada para o controlador.

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

Passar a ID da política do Azure AD B2C

O snippet de código a seguir demonstra um personalizado MyAccountController com a ação SignIn e SignUp . A ação passa um parâmetro nomeado 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);
}

No modo de exibição _LoginPartial.cshtml , altere o asp-controller valor para MyAccountController qualquer outro link de autenticação, como inscrever-se ou editar perfil.

Passar parâmetros personalizados

O snippet de código a seguir demonstra um personalizado MyAccountController com a ação SignIn . A ação passa um parâmetro nomeado 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, no OnRedirectToIdentityProvider método, leia o 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);
}

Proteger seu redirecionamento de logoff

Após o logoff, 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 Token de ID Obrigatório em solicitações de logoff estiver ativado, o Azure AD B2C verificará se o valor corresponde post_logout_redirect_uri a um dos URIs de redirecionamento configurados do aplicativo antes de executar o redirecionamento. Se nenhuma URL de resposta correspondente tiver sido configurada para o aplicativo, uma mensagem de erro será exibida e o usuário não será redirecionado.

Para dar suporte a um redirecionamento de logoff seguro em seu aplicativo, primeiro siga as etapas nas seções Controlador de Conta e Suporte a cenários avançados . Em seguida, siga as etapas abaixo:

  1. No MyAccountController.cs controlador, adicione uma ação SignOut usando o seguinte snippet 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 snippet 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 opção SaveTokens para controladores ter 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 do URI de redirecionamento de logoff à 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 logoff estará no formato: https://your-app.com/signout/<your-sign-up-in-policy>. Essa URL deve ser adicionada às URLs de resposta do Registro de Aplicativo.

Controle de acesso baseado em função

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 declaração deve ser uma das 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 Authorize atributo a um controlador, ação ou Página Razor limita o 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 acesso à ação Claims aos usuários autorizados pela EmployeeOnly política:

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

Próximas etapas