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:
- Configurar a autenticação numa aplicação Web de exemplo
- Ative a autenticação na sua própria aplicação Web.
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:
- Atualize a
Instance
entrada com o seu domínio personalizado. - Atualize a entrada com o
Domain
seu ID de inquilino. Para obter mais informações, consulte Utilizar o ID do inquilino.
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:
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.
Conclua o procedimento Suportar cenários avançados .
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:
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.
Complete the Support advanced scenarios procedure.
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:
Complete the Support advanced scenarios procedure.
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:
Configure o elemento ContentDefinitionParameters .
Complete the Support advanced scenarios procedure.
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:
Complete the Support advanced scenarios procedure.
Na sua política personalizada, defina um perfil técnico de sugestão de token de ID.
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:
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); }
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 oid_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); }
ConfigureServices
Na função, adicione a opçãoSaveTokens
para Os Controladores têm acesso aoid_token
valor:services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAdB2C", options); options.Events ??= new OpenIdConnectEvents(); options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc; options.SaveTokens = true; });
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
- Para saber mais sobre autorização, veja Introdução à autorização no ASP.NET Core.