Compartilhar via


Distribuir recursos para públicos-alvo segmentados em um aplicativo ASP.NET Core

Nesse guia, você usará o filtro de segmentação para implementar um recurso para públicos-alvo do seu aplicativo ASP.NET Core. Para obter mais informações sobre o filtro de destino, consulte Distribuir recursos para públicos-alvo.

Pré-requisitos

Crie um aplicativo Web com um sinalizador de recurso

Nessa seção, você cria um aplicativo da web que permite que os usuários efetuem login e usem o sinalizador de recurso Beta que você criou anteriormente.

  1. Crie um aplicativo da Web que se autentique em um banco de dados local utilizando o seguinte comando.

    dotnet new webapp --auth Individual -o TestFeatureFlags
    
  2. Navegue até o diretório TestFeatureFlags recém-criado e adicione referências aos seguintes pacotes NuGet.

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    dotnet add package Azure.Identity
    
  3. Crie um segredo de usuário para o aplicativo executando os seguintes comandos.

    O comando usa o Secret Manager para armazenar um segredo chamado Endpoints:AppConfiguration, que armazena o ponto de extremidade para seu repositório de Configuração de Aplicativos do Azure. Substitua o espaço reservado <your-App-Configuration-endpoint> pelo ponto de extremidade do seu armazenamento de Configuração de Aplicativos do Azure. Você pode encontrar o ponto de extremidade na lâmina Visão geral do repositório de configuração de aplicativos no portal do Azure.

    dotnet user-secrets init
    dotnet user-secrets set Endpoints:AppConfiguration "<your-App-Configuration-endpoint>"
    
  4. Adicione a Configuração de Aplicativos do Azure e o gerenciamento de recursos ao seu aplicativo.

    1. Você usa a autenticação DefaultAzureCredential no repositório de Configuração de Aplicativos. Siga as instruções para atribuir à credencial a função Leitor de Dados de Configuração de Aplicativo. Certifique-se de permitir tempo suficiente para a permissão se propagar antes de executar seu aplicativo.

    2. Atualize o arquivo Program.cs com o código a seguir.

      // Existing code in Program.cs
      // ... ...
      
      using Azure.Identity;
      
      var builder = WebApplication.CreateBuilder(args);
      
      // Retrieve the endpoint
      string endpoint = builder.Configuration.GetValue<string>("Endpoints:AppConfiguration") 
          ?? throw new InvalidOperationException("The setting `Endpoints:AppConfiguration` was not found.");
      
      // Connect to Azure App Configuration and load all feature flags with no label
      builder.Configuration.AddAzureAppConfiguration(options =>
      {
          options.Connect(new Uri(endpoint), new DefaultAzureCredential())
                 .UseFeatureFlags();
      });
      
      // Add Azure App Configuration middleware to the container of services
      builder.Services.AddAzureAppConfiguration();
      
      // Add feature management to the container of services
      builder.Services.AddFeatureManagement();
      
      // The rest of existing code in Program.cs
      // ... ...
      
  5. Habilite a configuração e a atualização do sinalizador de recursos da Configuração de Aplicativos do Azure com o middleware da Configuração de Aplicativos.

    Atualize Program.cs com o código a seguir.

    // Existing code in Program.cs
    // ... ...
    
    var app = builder.Build();
    
    // Use Azure App Configuration middleware for dynamic configuration refresh
    app.UseAzureAppConfiguration();
    
    // The rest of existing code in Program.cs
    // ... ...
    
  6. Adicione uma nova página Razor vazia chamada Beta no diretório Páginas. Ele inclui dois arquivos Beta.cshtml e Beta.cshtml.cs.

    @page
    @model TestFeatureFlags.Pages.BetaModel
    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  7. Abra Beta.cshtml.cs e adicione o FeatureGateatributo à classe BetaModel.

    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.FeatureManagement.Mvc;
    
    namespace TestFeatureFlags.Pages
    {
        [FeatureGate("Beta")]
        public class BetaModel : PageModel
        {
            public void OnGet()
            {
            }
        }
    }
    
  8. Abra Pages/_ViewImports.cshtml e registre o Auxiliar de Marcação do gerenciador de recursos usando uma diretiva @addTagHelper.

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  9. Abra _Layout.cshtml no diretório Páginas/Compartilhado. Insira uma nova marca <feature> entre os itens de barra de navegação Página Inicial e Privacidade, conforme mostrado nas linhas realçadas abaixo.

    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container">
            <a class="navbar-brand" asp-area="" asp-page="/Index">TestAppConfigNet3</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                    </li>
                    <feature name="Beta">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Beta">Beta</a>
                        </li>
                    </feature>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    

Habilitar o direcionamento para o aplicativo Web

O filtro de direcionamento avalia o estado do recurso de um usuário com base no contexto de direcionamento do usuário, que compreende a ID do usuário e os grupos aos quais o usuário pertence. Neste exemplo, use o endereço de email do usuário conectado como a ID do usuário e o nome de domínio do endereço de email como o grupo.

  1. Adicione um arquivo ExampleTargetingContextAccessor.cs com o código a seguir. Implemente a interface ITargetingContextAccessor para fornecer o contexto de direcionamento para o usuário conectado da solicitação atual.

    using Microsoft.FeatureManagement.FeatureFilters;
    
    namespace TestFeatureFlags
    {
        public class ExampleTargetingContextAccessor : ITargetingContextAccessor
        {
            private const string TargetingContextLookup = "ExampleTargetingContextAccessor.TargetingContext";
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public ExampleTargetingContextAccessor(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
    
            public ValueTask<TargetingContext> GetContextAsync()
            {
                HttpContext httpContext = _httpContextAccessor.HttpContext;
                if (httpContext.Items.TryGetValue(TargetingContextLookup, out object value))
                {
                    return new ValueTask<TargetingContext>((TargetingContext)value);
                }
                List<string> groups = new List<string>();
                if (httpContext.User.Identity.Name != null)
                {
                    groups.Add(httpContext.User.Identity.Name.Split("@", StringSplitOptions.None)[1]);
                }
                TargetingContext targetingContext = new TargetingContext
                {
                    UserId = httpContext.User.Identity.Name,
                    Groups = groups
                };
                httpContext.Items[TargetingContextLookup] = targetingContext;
                return new ValueTask<TargetingContext>(targetingContext);
            }
        }
    }
    
  2. Abra o arquivo Program.cs e habilite o filtro de direcionamento chamando o método WithTargeting. Você passa o tipo ExampleTargetingContextAccessor que o filtro de destino usará para obter o contexto de direcionamento durante a avaliação do sinalizador de recurso. Adicione HttpContextAccessor à coleção de serviços para permitir que ExampleTargetingContextAccessor acessem as informações do usuário conectado do HttpContext.

    // Existing code in Program.cs
    // ... ...
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement()
                    .WithTargeting<ExampleTargetingContextAccessor>();
    
    // Add HttpContextAccessor to the container of services.
    builder.Services.AddHttpContextAccessor();
    
    // The rest of existing code in Program.cs
    // ... ...
    

    Observação

    Para aplicativos Blazor, consulte as instruções para habilitar o gerenciamento de recursos como serviços com escopo.

Filtro de direcionamento em ação

  1. Compile e execute o aplicativo. A princípio, o item Beta não será mostrado na barra de ferramentas porque o Percentual padrão está definido como 0.

    Usuário não conectado e item Beta não exibido

  2. Selecione o link Registrar no canto superior direito para criar uma nova conta de usuário. Use um endereço de email de test@contoso.com. Na tela Registrar Confirmação, selecione a opção Clique aqui para confirmar sua conta.

  3. Entre como test@contoso.com usando a senha definida durante o registro da conta.

    O item Beta agora é mostrado na barra de ferramentas porque test@contoso.com foi especificado como um usuário de destino.

    Usuário conectado e item Beta exibido

    Agora, entre como testuser@contoso.com usando a senha definida durante o registro da conta. O item Beta não aparece na barra de ferramentas, porque testuser@contoso.com está especificado como um usuário excluído.

    Você pode criar mais usuários com endereços de email @contoso.com e @contoso-xyz.com para ver o comportamento das configurações do grupo.

    Os usuários com endereços de email contoso-xyz.com não verão o item Beta. Enquanto 50% dos usuários com @contoso.com endereços de email verão o item Beta, os outros 50% não verão o item Beta.

Próximas etapas

Para saber mais sobre os filtros de recursos, confira os documentos a seguir.

Para obter o resumo completo dos recursos da biblioteca de gerenciamento de recursos .NET, continue para o documento a seguir.