Migrar uma API Web baseada em OWIN para b2clogin.com ou para um domínio personalizado

Este artigo descreve uma técnica para habilitar a compatibilidade com vários emissores de token em APIs Web que implementam a OWIN (Interface da Web aberta para .NET). A compatibilidade com vários pontos de extremidade de token é útil quando você migra as APIs do Azure AD B2C (Azure Active Directory B2C) e os respectivos aplicativos de um domínio para o outro. Por exemplo, de login.microsoftonline.com para b2clogin.com ou para um domínio personalizado.

Ao adicionar suporte na API para aceitar tokens emitidos por b2clogin.com, login.microsoftonline.com ou um domínio personalizado, você pode migrar os aplicativos Web em etapas antes de remover o suporte para tokens emitidos por login.microsoftonline.com da API.

As seções a seguir apresentam um exemplo de como habilitar vários emissores em uma API Web que usa os componentes de middleware (Katana) do Microsoft OWIN. Embora os exemplos de código sejam específicos para o middleware do Microsoft OWIN, a técnica geral deve ser aplicável a outras bibliotecas OWIN.

Pré-requisitos

Você precisará dos seguintes recursos do Azure AD B2C em vigor antes de continuar com as etapas deste artigo:

Obter pontos de extremidade do emissor do token

Primeiro, você precisa obter os URIs do ponto de extremidade do emissor do token para cada emissor para o qual você deseja dar suporte na API. Para obter os pontos de extremidade b2clogin.com e login.microsoftonline.com compatíveis com o locatário Azure AD B2C, use o procedimento a seguir no portal do Azure.

Comece selecionando um dos fluxos de usuário existentes:

  1. Navegue até o locatário do Azure AD B2C no portal do Azure

  2. Em Políticas, selecione Fluxos de usuários (políticas)

  3. Selecione uma política existente, por exemplo B2C_1_signupsignin1 e, em seguida, selecione Executar fluxo de usuário

  4. No cabeçalho Executar fluxo de usuário próximo à parte superior da página, selecione o hiperlink para navegar até o ponto de extremidade de descoberta do OpenID Connect para esse fluxo de usuário.

    Hiperlink de URI conhecido na página Executar agora do portal do Azure

  5. Na página que é aberta no navegador, registre o valor issuer, por exemplo:

    https://your-b2c-tenant.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

  6. Use a lista suspensa Selecionar domínio para selecionar o outro domínio e, em seguida, execute novamente as duas etapas anteriores e registre seu valor issuer.

Agora você deve ter dois URIs registrados que são semelhantes a:

https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/
https://your-b2c-tenant.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

Políticas personalizadas

Se você tiver políticas personalizadas em vez de fluxos de usuário, poderá usar um processo semelhante para obter os URIs do emissor.

  1. Navegue até o locatário do Azure AD B2C.
  2. Selecione Estrutura de Experiência de Identidade
  3. Selecione uma das políticas de terceira parte confiável, por exemplo, B2C_1A_signup_signin.
  4. Use a lista suspensa Selecionar domínio para selecionar um domínio, por exemplo, yourtenant.b2clogin.com.
  5. Selecione o hiperlink exibido em Ponto de extremidade de descoberta do OpenID Connect.
  6. Registre o valor issuer.
  7. Realize as etapas 4 a 6 para o outro domínio, por exemplo, login.microsoftonline.com.

Obter o código de exemplo

Agora que você tem os dois URIs do ponto de extremidade do token, é necessário atualizar o código para especificar que ambos os pontos de extremidade são emissores válidos. Para examinar um exemplo, baixe ou clone o aplicativo de exemplo e atualize o exemplo para dar suporte aos dois pontos de extremidade como emissores válidos.

Baixe os arquivos: active-directory-b2c-dotnet-webapp-and-webapi-master.zip

git clone https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi.git

Habilitar vários emissores na API Web

Nesta seção, você atualiza o código para especificar que ambos os pontos de extremidade do emissor do token são válidos.

  1. Abra a solução B2C-WebAPI-DotNet.sln no Visual Studio

  2. No projeto TaskService, abra o arquivo TaskService\App_Start\Startup.Auth.cs no editor

  3. Adicione a seguinte diretiva using para a parte superior do arquivo:

    using System.Collections.Generic;

  4. Adicione a propriedade ValidIssuers à definição TokenValidationParameterse especifique os URIs que você registrou na seção anterior:

    TokenValidationParameters tvps = new TokenValidationParameters
    {
        // Accept only those tokens where the audience of the token is equal to the client ID of this app
        ValidAudience = ClientId,
        AuthenticationType = Startup.DefaultPolicy,
        ValidIssuers = new List<string> {
            "https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/",
            "https://{your-b2c-tenant}.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"//,
            //"https://your-custom-domain/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"
        }
    };
    

TokenValidationParameters é fornecido por MSAL.NET e é consumido pelo middleware OWIN na próxima seção do código em Startup.Auth.cs. Com vários emissores válidos especificados, o pipeline do aplicativo OWIN é informado de que os dois pontos de extremidade do token são emissores válidos.

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
    // This SecurityTokenProvider fetches the Azure AD B2C metadata &  from the OpenID Connect metadata endpoint
    AccessTokenFormat = new JwtFormat(tvps, new tCachingSecurityTokenProvider(String.Format(AadInstance, ultPolicy)))
});

Como mencionado anteriormente, outras bibliotecas OWIN geralmente fornecem um recurso semelhante para dar suporte a vários emissores. Embora esteja fora do escopo deste artigo a apresentação de exemplos para cada biblioteca, você pode usar uma técnica semelhante para a maioria delas.

Alternar pontos de extremidade no aplicativo Web

Agora, com os dois URIs compatíveis com a API Web, você precisa atualizar o aplicativo Web para que ele recupere tokens do ponto de extremidade b2clogin.com.

Por exemplo, você pode configurar o aplicativo Web de exemplo para usar o novo ponto de extremidade modificando o valor ida:AadInstance no arquivo TaskWebApp\Web.config do projeto TaskWebApp.

Altere o valor ida:AadInstance na Web.config do TaskWebApp para que ele faça referência a {your-b2c-tenant-name}.b2clogin.com em vez de login.microsoftonline.com.

Antes:

<!-- Old value -->
<add key="ida:AadInstance" value="https://login.microsoftonline.com/tfp/{0}/{1}" />

Depois (substitua {your-b2c-tenant} pelo nome do locatário B2C):

<!-- New value -->
<add key="ida:AadInstance" value="https://{your-b2c-tenant}.b2clogin.com/tfp/{0}/{1}" />

Quando as cadeias de caracteres do ponto de extremidade são construídas durante a execução do aplicativo Web, os pontos de extremidades baseados em b2clogin.com são usados ao solicitar tokens.

Ao usar o domínio personalizado:

<!-- Custom domain -->
<add key="ida:AadInstance" value="https://custom-domain/{0}/{1}" />

Próximas etapas

Este artigo apresentou um método de configuração de uma API Web que implementa o middleware do Microsoft OWIN (Katana) para aceitar tokens de vários pontos de extremidade do emissor. Como você pode observar, há várias outras cadeias de caracteres nos arquivos Web.Config dos projetos TaskService e TaskWebApp que precisariam ser alterados se você quiser compilar e executar esses projetos no próprio locatário. Você pode modificar os projetos de modo adequada se quiser vê-los em ação. No entanto, a explicação completa sobre isso está fora do escopo deste artigo.

Para obter mais informações sobre os diversos tipos de tokens de autenticação emitidos pelo Azure AD B2C, confira Visão geral de tokens no Azure Active Directory B2C.