Partilhar via


Ativar opções de autenticação numa aplicação Web com Azure AD B2C

Este artigo descreve como ativar, personalizar e melhorar a experiência de autenticação do Azure Active Directory B2C (Azure AD B2C) para a sua aplicação Web.

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

Utilizar um domínio personalizado

Ao utilizar um domínio personalizado, pode marcar totalmente o URL de autenticação. Do ponto de vista do utilizador, os utilizadores permanecem no 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, também pode substituir o nome do inquilino B2C, contoso.onmicrosoft.com, no URL do pedido de autenticação pelo GUID do ID do inquilino. Por exemplo, pode mudar https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ para https://account.contosobank.co.uk/<tenant ID GUID>/.

Para utilizar um domínio personalizado e o seu ID de inquilino no URL de autenticação, siga a documentação de orientação em Ativar domínios personalizados. Na pasta raiz do projeto, abra o ficheiro appsettings.json . Este ficheiro contém informações sobre a sua Azure AD fornecedor de identidade B2C.

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

O JSON seguinte mostra as definições da aplicação antes da alteração:

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

O JSON seguinte mostra as definições da aplicação após a alteração:

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

Suportar cenários avançados

O AddMicrosoftIdentityWebAppAuthentication método na API de plataforma de identidades da Microsoft permite que os programadores adicionem código para cenários de autenticação avançada ou subscrevam eventos OpenIdConnect. Por exemplo, pode subscrever OnRedirectToIdentityProvider, o que lhe permite personalizar o pedido de autenticação que a sua aplicação envia para Azure AD B2C.

Para suportar cenários avançados, abra o ficheiro Startup.cs e, na ConfigureServices função, substitua AddMicrosoftIdentityWebAppAuthentication pelo seguinte fragmento 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 fragmento de código seguinte à Startup.cs classe.

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

Pode transmitir parâmetros entre o controlador e a função através de OnRedirectToIdentityProvider parâmetros de contexto.

Pré-preencher o nome do início de sessão

Durante um percurso de início de sessão do utilizador, a sua aplicação poderá visar um utilizador específico. Quando uma aplicação se destina a um utilizador, pode especificar no pedido de autorização o login_hint parâmetro de consulta com o nome de início de sessão do utilizador. Azure AD B2C preenche automaticamente o nome de início de sessão e o utilizador tem de fornecer apenas a palavra-passe.

Para pré-preencher o nome do início de sessão, faça o seguinte:

  1. Se estiver a utilizar uma política personalizada, adicione a afirmação de entrada necessária, conforme descrito em Configurar o início de sessão direto.

  2. Conclua o procedimento Suportar cenários avançados .

  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 fornecedor de identidade

Se tiver configurado o percurso de início de sessão para a sua aplicação incluir contas sociais, como o Facebook, LinkedIn ou Google, pode especificar o domain_hint parâmetro. Este parâmetro de consulta fornece uma sugestão para Azure AD B2C sobre o fornecedor de identidade social que deve ser utilizado para o início de sessão. Por exemplo, se a aplicação especificar domain_hint=facebook.com, o fluxo de início de sessão vai diretamente para a página de início de sessão do Facebook.

Para redirecionar os utilizadores para um fornecedor de identidade externo, faça o seguinte:

  1. Verifique o nome de domínio do seu fornecedor de identidade externa. Para obter mais informações, veja Redirecionar o início de sessão para um fornecedor de redes sociais.

  2. Complete the Support advanced scenarios procedure.

  3. Na função OnRedirectToIdentityProviderFunc , 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 IU

A personalização de idiomas no Azure AD B2C permite ao seu fluxo de utilizador acomodar uma variedade de idiomas de acordo com as necessidades dos seus clientes. Para obter mais informações, veja Personalização de idiomas.

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

  1. Configurar a personalização de idiomas.

  2. Complete the Support advanced scenarios procedure.

  3. Add the following line of code to the OnRedirectToIdentityProvider function:

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

Transmitir um parâmetro de cadeia de consulta personalizado

Com as políticas personalizadas, pode transmitir um parâmetro de cadeia de consulta personalizado. Um bom exemplo de caso de utilização é quando pretende alterar dinamicamente o conteúdo da página.

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

  1. Configure o elemento ContentDefinitionParameters .

  2. Complete the Support advanced scenarios procedure.

  3. Add the following line of code to the OnRedirectToIdentityProvider function:

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

Transmitir uma sugestão de token de ID

Uma aplicação confiadora pode enviar um JSON Web Token (JWT) de entrada como parte do pedido de autorização do OAuth2. O token de entrada é uma sugestão sobre o utilizador ou o pedido de autorização. Azure AD B2C valida o token e, em seguida, extrai a afirmação.

Para incluir uma sugestão de token de ID no pedido de autenticação, faça o seguinte:

  1. Complete the Support advanced scenarios procedure.

  2. Na sua política personalizada, defina um perfil técnico de sugestão de token de ID.

  3. Add the following line of code to the OnRedirectToIdentityProvider function:

    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 quiser personalizar as ações SignIn, SignUp ou SignOut , recomendamos que crie o seu próprio controlador. Ter o seu próprio controlador permite-lhe transmitir parâmetros entre o controlador e a biblioteca de autenticação. AccountController faz parte do Microsoft.Identity.Web.UI pacote NuGet, que processa as ações de início de sessão e de fim de sessão. Pode encontrar a respetiva implementação na biblioteca Web da Identidade da Microsoft.

Adicionar o Controlador de conta

No seu projeto do Visual Studio, clique com o botão direito do rato na pasta Controladores e, em seguida, adicione um novo Controlador. Selecione MVC - Controlador Vazio e, em seguida, indique o nome MyAccountController.cs.

O fragmento de código seguinte 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);
        }

    }
}

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

Transmitir o ID da política B2C Azure AD

O fragmento de código seguinte demonstra um personalizado MyAccountController com a ação SignIn e SignUp . A ação transmite um parâmetro com o nome policy para a biblioteca de autenticação. Isto permite-lhe fornecer o ID de política B2C Azure AD correto 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 vista _LoginPartial.cshtml , altere o asp-controller valor para para MyAccountController quaisquer outras ligações de autenticação, como inscrição ou perfil de edição.

Transmitir parâmetros personalizados

The following code snippet demonstrates a custom MyAccountController with the SignIn action. The action passes a parameter named campaign_id to the authentication library.

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 Cenários avançados de suporte e, em seguida, 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 o redirecionamento de início de sessão

Após o fim de sessão, o utilizador é redirecionado para o URI especificado no post_logout_redirect_uri parâmetro, independentemente dos URLs de resposta especificados para a aplicação. No entanto, se for transmitido um valor válido id_token_hint e o Token exigir ID nos pedidos de início de sessão estiver ativado, Azure AD B2C verifica se o valor de post_logout_redirect_uri corresponde a um dos URIs de redirecionamento configurados da aplicação antes de executar o redirecionamento. Se não tiver sido configurado um URL de resposta correspondente para a aplicação, será apresentada uma mensagem de erro e o utilizador não será redirecionado.

Para suportar um redirecionamento de início de sessão seguro na sua aplicação, siga primeiro os passos nas secçõ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 SignOut com o seguinte fragmento 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 ao pedido de autenticação. O fragmento de código seguinte demonstra como transmitir o id_token_hint valor para o pedido 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 Os Controladores têm 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 ficheiro de configuração appsettings.json , adicione o caminho do URI de redirecionamento de início de sessão à 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 transmitido para o pedido de fim de sessão estará no formato: https://your-app.com/signout/<your-sign-up-in-policy>. Este URL tem de ser adicionado aos URLs de resposta do Registo de Aplicação.

Controlo de acesso baseado em funções

Com a autorização no ASP.NET Core pode verificar se os utilizadores estão autorizados a aceder a um recurso protegido através de um dos seguintes métodos:

ConfigureServices No método , adicione o AddAuthorization método , que adiciona o modelo de autorização. O exemplo seguinte cria uma política com o nome EmployeeOnly. A política verifica se existe uma afirmação EmployeeNumber . O valor da afirmação tem de 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"));
    });

Pode controlar a autorização no ASP.NET Core com AuthorizeAttribute e os seus vários parâmetros. Na sua forma mais básica, aplicar o atributo a um controlador, ação ou Página do Razor limita o Authorize acesso aos utilizadores autenticados desse componente.

Aplica políticas a controladores com o Authorize atributo com o nome da política. O código seguinte limita o acesso à ação Claims aos utilizadores autorizados pela EmployeeOnly política:

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

Passos seguintes