Compartilhar via


Configuração de um site que usa Serviços de Aplicativos (C#)

por Scott Mitchell

Observação

Desde que este artigo foi escrito, os provedores de associação ASP.NET foram substituídos pelo ASP.NET Identity. É altamente recomendável atualizar aplicativos para usar a plataforma ASP.NET Identity em vez dos provedores de associação apresentados no momento em que este artigo foi escrito. ASP.NET Identity tem várias vantagens em relação ao sistema de associação ASP.NET, incluindo :

  • Melhor desempenho
  • Extensibilidade e testabilidade aprimoradas
  • Suporte para OAuth, OpenID Connect e autenticação de dois fatores
  • Suporte à identidade baseada em declarações
  • Melhor interoperabilidade com o ASP.Net Core

ASP.NET versão 2.0 introduziu uma série de serviços de aplicativos, que fazem parte do .NET Framework e servem como um conjunto de serviços de bloco de construção que você pode usar para adicionar funcionalidade avançada ao seu aplicativo Web. Este tutorial explora como configurar um site no ambiente de produção para usar serviços de aplicativos e aborda problemas comuns com o gerenciamento de contas de usuário e funções no ambiente de produção.

Introdução

ASP.NET versão 2.0 introduziu uma série de serviços de aplicativos, que fazem parte do .NET Framework e servem como um conjunto de serviços de bloco de construção que você pode usar para adicionar funcionalidade avançada ao seu aplicativo Web. Os serviços de aplicativo incluem:

  • Associação – uma API para criar e gerenciar contas de usuário.
  • Funções – uma API para categorizar usuários em grupos.
  • Perfil – uma API para armazenar conteúdo personalizado e específico do usuário.
  • Mapa do Site – uma API para definir a estrutura lógica de um site na forma de uma hierarquia, que pode ser exibida por meio de controles de navegação, como menus e trilhas.
  • Personalização – uma API para manter as preferências de personalização, mais frequentemente usadas com WebParts.
  • Monitoramento de Integridade – uma API para monitorar o desempenho, a segurança, os erros e outras métricas de integridade do sistema para um aplicativo Web em execução.

As APIs de serviços de aplicativo não estão vinculadas a uma implementação específica. Em vez disso, você instrui os serviços de aplicativo a usar um provedor específico e esse provedor implementa o serviço usando uma tecnologia específica. Os provedores mais usados para aplicativos Web baseados na Internet hospedados em uma empresa de hospedagem na Web são os provedores que usam uma implementação de banco de dados SQL Server. Por exemplo, o SqlMembershipProvider é um provedor para a API de Associação que armazena informações de conta de usuário em um banco de dados do Microsoft SQL Server.

Usar os serviços de aplicativos e provedores de SQL Server adiciona alguns desafios ao implantar o aplicativo. Para começar, os objetos de banco de dados dos serviços de aplicativo devem ser criados corretamente nos bancos de dados de desenvolvimento e produção e inicializados adequadamente. Também há definições de configuração importantes que precisam ser feitas.

Observação

As APIs de serviços de aplicativo foram projetadas usando o modelo de provedor, um padrão de design que permite que os detalhes de implementação de uma API sejam fornecidos em runtime. O .NET Framework é fornecido com vários provedores de serviços de aplicativo que podem ser usados, como e SqlMembershipProviderSqlRoleProvider, que são provedores para as APIs de Associação e Funções que usam uma implementação de banco de dados SQL Server. Você também pode criar e conectar um provedor personalizado. Na verdade, o aplicativo Web Book Reviews já contém um provedor personalizado para a API de Mapa do Site (ReviewSiteMapProvider), que constrói o mapa do site a partir dos dados nas Genres tabelas e Books no banco de dados.

Este tutorial começa com uma análise de como estendi o aplicativo Web Revisões de Livros para usar as APIs de Associação e Funções. Em seguida, ele percorre a implantação de um aplicativo Web que usa serviços de aplicativo com uma implementação de banco de dados SQL Server e conclui abordando problemas comuns com o gerenciamento de contas de usuário e funções no ambiente de produção.

Atualizações ao aplicativo Book Reviews

Nos últimos tutoriais, o aplicativo Web Revisões de Livros foi atualizado de um site estático para um aplicativo Web dinâmico e controlado por dados, com um conjunto de páginas de administração para gerenciar gêneros e revisões. No entanto, esta seção de administração não está protegida no momento - qualquer usuário que conheça (ou adivinha) a URL da página de administração pode entrar e criar, editar ou excluir revisões em nosso site. Uma maneira comum de proteger determinadas partes de um site é implementar contas de usuário e, em seguida, usar regras de autorização de URL para restringir o acesso a determinados usuários ou funções. O aplicativo Web Book Reviews disponível para download com este tutorial dá suporte a contas de usuário e funções. Ele tem uma única função definida chamada Administração e somente os usuários nessa função podem acessar as páginas de administração.

Observação

Criei três contas de usuário no aplicativo Web Book Reviews: Scott, Jisun e Alice. Todos os três usuários têm a mesma senha: senha! Scott e Jisun estão no papel Administração, Alice não está. As páginas de não administração do site ainda estão acessíveis para usuários anônimos. Ou seja, você não precisa entrar para visitar o site, a menos que queira administrá-lo; nesse caso, você deve entrar como um usuário na função Administração.

A página de master do aplicativo Book Reviews foi atualizada para incluir uma interface do usuário diferente para usuários autenticados e anônimos. Se um usuário anônimo visitar o site, ela verá um link de Logon no canto superior direito. Um usuário autenticado vê a mensagem "Bem-vindo de volta, nome de usuário!" e um link para fazer logoff. Há também uma página de logon (~/Login.aspx), que contém um controle da Web de logon que fornece a interface do usuário e a lógica para autenticar um visitante. Somente os administradores podem criar novas contas. (Há páginas para criar e gerenciar contas de usuário na ~/Admin pasta.)

Configurando as APIs de Associação e Funções

O aplicativo Web Revisões de Livros usa as APIs de Associação e Funções para dar suporte a contas de usuário e agrupar esses usuários em funções (ou seja, a função Administração). As SqlMembershipProvider classes de provedor e SqlRoleProvider são usadas porque queremos armazenar informações de conta e função em um banco de dados SQL Server.

Observação

Este tutorial não se destina a ser um exame detalhado na configuração de um aplicativo Web para dar suporte às APIs de Associação e Funções. Para ver detalhadamente essas APIs e as etapas necessárias para configurar um site para usá-las, leia meus Tutoriais de Segurança do Site.

Para usar os serviços de aplicativo com um banco de dados SQL Server você deve primeiro adicionar os objetos de banco de dados usados por esses provedores ao banco de dados em que você deseja que as informações de conta de usuário e função sejam armazenadas. Esses objetos de banco de dados necessários incluem uma variedade de tabelas, exibições e procedimentos armazenados. A menos que especificado de outra forma, as SqlMembershipProvider classes de provedor e SqlRoleProvider usam um banco de dados SQL Server Express Edition chamado ASPNETDB localizado na pasta do App_Data aplicativo; se esse banco de dados não existir, ele será criado automaticamente com os objetos de banco de dados necessários por esses provedores em runtime.

É possível, e geralmente ideal, criar os objetos de banco de dados de serviços de aplicativo no mesmo banco de dados em que os dados específicos do aplicativo do site são armazenados. O .NET Framework é fornecido com uma ferramenta chamada aspnet_regsql.exe que instala os objetos de banco de dados em um banco de dados especificado. Eu fui em frente e usei essa ferramenta para adicionar esses objetos ao Reviews.mdf banco de dados na App_Data pasta (o banco de dados de desenvolvimento). Veremos como usar essa ferramenta posteriormente neste tutorial quando adicionarmos esses objetos ao banco de dados de produção.

Se você adicionar os objetos de banco de dados dos serviços de aplicativo a um banco de dados diferente de ASPNETDB , precisará personalizar as configurações de SqlMembershipProvider classes de provedor e SqlRoleProvider para que eles usem o banco de dados apropriado. Para personalizar o provedor de associação, adicione um <elemento de associação> na <system.web> seção em Web.config; use o <elemento roleManager> para configurar o provedor de Funções. O snippet a seguir é obtido do aplicativo Revisões de Livros e Web.config mostra as configurações de definição para as APIs de Associação e Funções. Observe que ambos registram um novo provedor – ReviewMembership e ReviewRole – que usam os SqlMembershipProvider provedores e SqlRoleProvider , respectivamente.

<configuration>
    <system.web>
        ...

        <membership defaultProvider="ReviewMembership">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlMembershipProvider" 
                     name="ReviewMembership" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </membership>

        <roleManager enabled="true" defaultProvider="ReviewRole">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlRoleProvider" 
                     name="ReviewRole" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </roleManager>

        ...
    </system.web>
</configuration>

O Web.config elemento s do <authentication> arquivo também foi configurado para dar suporte à autenticação baseada em formulários.

<configuration>
    <system.web>
        ...

        <authentication mode="Forms" />

        ...
    </system.web>
</configuration>

Limitando o acesso às páginas de administração

ASP.NET facilita a concessão ou negação de acesso a um arquivo ou pasta específico por usuário ou por função por meio de seu recurso de autorização de URL . (Discutimos brevemente a autorização de URL no tutorial Principais Diferenças entre o IIS e o Servidor de Desenvolvimento do ASP.NET e mostramos como o IIS e o servidor de desenvolvimento de ASP.NET aplicam regras de autorização de URL de forma diferente para conteúdo estático versus dinâmico.) Como queremos proibir o ~/Admin acesso à pasta, exceto para os usuários na função Administração, precisamos adicionar regras de autorização de URL a essa pasta. Especificamente, as regras de autorização de URL precisam permitir que os usuários na função Administração e negar todos os outros usuários. Isso é feito adicionando um Web.config arquivo à ~/Admin pasta com o seguinte conteúdo:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

Para obter mais informações sobre ASP.NET recurso de autorização de URL e como usá-lo para soletrar regras de autorização para usuários e funções, leia os tutoriais de Autorização Baseada no Usuário e Autorização Baseada em Função em meus Tutoriais de Segurança do Site.

Implantando um aplicativo Web que usa serviços de aplicativos

Ao implantar um site que usa serviços de aplicativo e um provedor que armazena as informações dos serviços de aplicativo em um banco de dados, é imperativo que os objetos de banco de dados necessários para os serviços de aplicativo sejam criados no banco de dados de produção. Inicialmente, o banco de dados de produção não contém esses objetos, portanto, quando o aplicativo é implantado pela primeira vez (ou quando ele é implantado pela primeira vez após a adição dos serviços de aplicativo), você deve executar etapas extras para obter esses objetos de banco de dados necessários no banco de dados de produção.

Outro desafio pode surgir ao implantar um site que usa serviços de aplicativo se você pretende replicar as contas de usuário criadas no ambiente de desenvolvimento para o ambiente de produção. Dependendo da configuração de Associação e Funções, é possível que, mesmo que você copie com êxito as contas de usuário que foram criadas no ambiente de desenvolvimento para o banco de dados de produção, esses usuários não poderão entrar no aplicativo Web em produção. Examinaremos a causa desse problema e discutiremos como evitar que isso aconteça.

ASP.NET é fornecido com uma boa WSAT (Ferramenta de Administração de Site) que pode ser iniciada no Visual Studio e permite que a conta de usuário, as funções e as regras de autorização sejam gerenciadas por meio de uma interface baseada na Web. Infelizmente, o WSAT só funciona para sites locais, o que significa que ele não pode ser usado para gerenciar remotamente contas de usuário, funções e regras de autorização para o aplicativo Web no ambiente de produção. Examinaremos diferentes maneiras de implementar o comportamento semelhante ao WSAT do seu site de produção.

Adicionando os objetos de banco de dados usando aspnet_regsql.exe

O tutorial Implantando um banco de dados mostrou como copiar as tabelas e os dados do banco de dados de desenvolvimento para o banco de dados de produção, e essas técnicas certamente podem ser usadas para copiar os objetos de banco de dados dos serviços de aplicativo para o banco de dados de produção. Outra opção é a aspnet_regsql.exe ferramenta , que adiciona ou remove os objetos de banco de dados dos serviços de aplicativo de um banco de dados.

Observação

A aspnet_regsql.exe ferramenta cria os objetos de banco de dados em um banco de dados especificado. Ele não migra dados nesses objetos de banco de dados do banco de dados de desenvolvimento para o banco de dados de produção. Se você pretende copiar as informações de conta de usuário e função no banco de dados de desenvolvimento para o banco de dados de produção, use as técnicas abordadas no tutorial Implantando um banco de dados.

Vamos examinar como adicionar os objetos de banco de dados ao banco de dados de produção usando a aspnet_regsql.exe ferramenta . Comece abrindo o Windows Explorer e navegando até o diretório .NET Framework versão 2.0 no computador, %WINDIR%\ Microsoft.NET\Framework\v2.0.50727. Lá, você deve encontrar a aspnet_regsql.exe ferramenta. Essa ferramenta pode ser usada na linha de comando, mas também inclui uma interface gráfica do usuário; clique duas vezes no aspnet_regsql.exe arquivo para iniciar seu componente gráfico.

A ferramenta começa exibindo uma tela inicial explicando sua finalidade. Clique em Avançar para avançar para a tela "Selecionar uma opção de instalação", que é mostrada na Figura 1. Aqui, você pode optar por adicionar os objetos de banco de dados dos serviços de aplicativo ou removê-los de um banco de dados. Como queremos adicionar esses objetos ao banco de dados de produção, selecione a opção "Configurar SQL Server para serviços de aplicativos" e clique em Avançar.

Escolha Configurar SQL Server para Serviços de Aplicativos

Figura 1: Optar por Configurar SQL Server para Serviços de Aplicativos (clique para exibir imagem em tamanho real)

Na tela "Selecione o servidor e o banco de dados" solicita informações para se conectar ao banco de dados. Insira o servidor de banco de dados, as credenciais de segurança e o nome do banco de dados fornecido por sua empresa de hospedagem da Web e clique em Avançar.

Observação

Depois de inserir o servidor de banco de dados e as credenciais, você poderá receber um erro ao expandir a lista suspensa do banco de dados. A aspnet_regsql.exe ferramenta consulta a tabela do sysdatabases sistema para recuperar uma lista de bancos de dados no servidor, mas algumas empresas de hospedagem da Web bloqueiam seus servidores de banco de dados para que essas informações não estejam disponíveis publicamente. Se você receber esse erro, poderá digitar o nome do banco de dados diretamente na lista suspensa.

Fornecer a ferramenta com as informações de conexão do banco de dados

Figura 2: Fornecer a ferramenta com as informações de conexão do banco de dados (clique para exibir a imagem em tamanho real)

A tela subsequente resume as ações que estão prestes a ocorrer, ou seja, que os objetos de banco de dados dos serviços de aplicativo serão adicionados ao banco de dados especificado. Clique em Avançar para concluir esta ação. Após alguns instantes, a tela final é exibida, observando que os objetos de banco de dados foram adicionados (consulte a Figura 3).

Sucesso! Os objetos de banco de dados dos Serviços de Aplicativo foram adicionados ao banco de dados de produção

Figura 3: Sucesso! Os objetos de banco de dados dos Serviços de Aplicativo foram adicionados ao Banco de Dados de Produção (clique para exibir a imagem em tamanho real)

Para verificar se os objetos de banco de dados dos serviços de aplicativo foram adicionados com êxito ao banco de dados de produção, abra SQL Server Management Studio e conecte-se ao banco de dados de produção. Como mostra a Figura 4, agora você deve ver as tabelas de banco de dados dos serviços de aplicativo em seu banco de dados, aspnet_Applications, aspnet_Membership, aspnet_Userse assim por diante.

Confirme se os objetos de banco de dados foram adicionados ao banco de dados de produção

Figura 4: Confirme se os objetos de banco de dados foram adicionados ao banco de dados de produção (clique para exibir a imagem em tamanho real)

Você só precisará usar a aspnet_regsql.exe ferramenta ao implantar seu aplicativo Web pela primeira vez ou pela primeira vez depois de começar a usar os serviços de aplicativo. Depois que esses objetos de banco de dados estiverem no banco de dados de produção, eles não precisarão ser adicionados ou modificados novamente.

Copiando contas de usuário do desenvolvimento para a produção

Ao usar as classes e SqlRoleProvider do SqlMembershipProvider provedor para armazenar as informações dos serviços de aplicativo em um banco de dados SQL Server, as informações de conta de usuário e função são armazenadas em uma variedade de tabelas de banco de dados, incluindo aspnet_Users, aspnet_Membership, aspnet_Rolese aspnet_UsersInRoles, entre outras. Se durante o desenvolvimento você criar contas de usuário no ambiente de desenvolvimento, poderá replicar essas contas de usuário em produção copiando os registros correspondentes das tabelas de banco de dados aplicáveis. Se você usou o Assistente de Publicação de Banco de Dados para implantar os objetos de banco de dados dos serviços de aplicativo, talvez você também tenha escolhido copiar os registros, o que resultaria nas contas de usuário criadas no desenvolvimento para também estarem em produção. Mas, dependendo das configurações, você pode descobrir que os usuários cujas contas foram criadas em desenvolvimento e copiadas para produção não podem fazer logon no site de produção. O que acontece?

As SqlMembershipProvider classes de provedor e SqlRoleProvider foram projetadas de modo que um único banco de dados pudesse servir como um repositório de usuários para vários aplicativos, em que cada aplicativo poderia, em teoria, ter usuários com nomes de usuário e funções sobrepostas com o mesmo nome. Para permitir essa flexibilidade, o banco de dados mantém uma lista de aplicativos na aspnet_Applications tabela e cada usuário está associado a um desses aplicativos. Especificamente, a aspnet_Users tabela tem uma ApplicationId coluna que vincula cada usuário a um registro na aspnet_Applications tabela.

Além da ApplicationId coluna, a aspnet_Applications tabela também inclui uma ApplicationName coluna, que fornece um nome mais amigável para o aplicativo. Quando um site tenta trabalhar com uma conta de usuário, como validar as credenciais de um usuário na página de logon, ele deve informar à SqlMembershipProvider classe com qual aplicativo trabalhar. Normalmente, ele faz isso fornecendo o nome do aplicativo e esse valor vem da configuração do provedor no Web.config , especificamente por meio do applicationName atributo .

Mas o que acontecerá se o applicationName atributo não for especificado em Web.config? Nesse caso, o sistema de associação usa o caminho raiz do aplicativo como o applicationName valor. Se o applicationName atributo não estiver explicitamente definido em Web.config, então, haverá a possibilidade de que o ambiente de desenvolvimento e o ambiente de produção usem uma raiz de aplicativo diferente e, portanto, serão associados a nomes de aplicativos diferentes nos serviços de aplicativo. Se essa incompatibilidade ocorrer, os usuários criados no ambiente de desenvolvimento terão um ApplicationId valor que não corresponde ao ApplicationId valor para o ambiente de produção. O resultado líquido é que esses usuários não poderão fazer logon.

Observação

Se você se encontrar nessa situação - com contas de usuário copiadas para produção com um valor incompatível ApplicationId - você poderá escrever uma consulta para atualizar esses valores incorretos ApplicationId para o ApplicationId usado na produção. Depois de atualizados, os usuários cujas contas foram criadas no ambiente de desenvolvimento agora poderão entrar no aplicativo Web em produção.

A boa notícia é que há uma etapa simples que você pode tomar para garantir que os dois ambientes usem o mesmo ApplicationId : defina explicitamente o applicationName atributo em Web.config para todos os seus provedores de serviços de aplicativo. Defina explicitamente o applicationName atributo como "BookReviews" nos <membership> elementos e <roleManager> como este snippet de Web.config mostra.

<membership defaultProvider="ReviewMembership">
    <providers>
        <clear />

        <add type="System.Web.Security.SqlMembershipProvider" 
             name="ReviewMembership" 
             connectionStringName="ReviewsConnectionString" 
             applicationName="BookReviews" />
    </providers>
</membership>

Para obter mais discussões sobre como definir o applicationName atributo e a lógica por trás dele, consulte a postagem no blog de Scott Guthrie , Sempre defina a propriedade applicationName ao configurar ASP.NET Associação e outros Provedores.

Gerenciando contas de usuário no ambiente de produção

A ferramenta de administração de sites ASP.NET (WSAT) facilita a criação e o gerenciamento de contas de usuário, definição e aplicação de funções e explicitar regras de autorização baseadas em função e usuário. Você pode iniciar o WSAT no Visual Studio acessando o Gerenciador de Soluções e clicando no ícone configuração de ASP.NET ou acessando os menus Site ou Projeto e selecionando o item de menu Configuração ASP.NET. Infelizmente, o WSAT só pode funcionar com sites locais. Portanto, você não pode usar o WSAT de sua estação de trabalho para gerenciar o site no ambiente de produção.

A boa notícia é que toda a funcionalidade exposta fornecida pelo WSAT está disponível programaticamente por meio das APIs de Associação e Funções; Além disso, muitas das telas WSAT usam os controles padrão ASP.NET relacionados ao logon. Em suma, você pode adicionar ASP.NET páginas ao seu site que oferecem os recursos de gerenciamento necessários.

Lembre-se de que um tutorial anterior atualizou o aplicativo Web Revisões de Livros para incluir uma ~/Admin pasta e essa pasta foi configurada para permitir apenas usuários na função Administração. Adicionei uma página à pasta chamada CreateAccount.aspx da qual um administrador pode criar uma nova conta de usuário. Esta página usa o controle CreateUserWizard para exibir a interface do usuário e a lógica de back-end para criar uma nova conta de usuário. Além disso, personalizei o controle para incluir uma CheckBox que solicita se o novo usuário também deve ser adicionado à função Administração (consulte a Figura 5). Com um pouco de trabalho, você pode criar um conjunto personalizado de páginas que implementa as tarefas relacionadas ao gerenciamento de função e usuário que, de outra forma, seriam fornecidas pelo WSAT.

Observação

Para obter mais informações sobre como usar as APIs de Associação e Funções, juntamente com os controles web ASP.NET relacionados ao logon, leia meus Tutoriais de Segurança do Site. Para saber mais sobre como personalizar o controle CreateUserWizard, consulte os tutoriais Criando contas de usuário e armazenando informações adicionais do usuário ou marcar o artigo de Erich Peterson, Personalizando o controle CreateUserWizard.

Os administradores podem criar novas contas de usuário

Figura 5: Os administradores podem criar novas contas de usuário (clique para exibir a imagem em tamanho real)

Se você precisar da funcionalidade completa do WSAT marcar a Ferramenta de Administração de Site Própria, na qual o autor Dan Clem percorre o processo de criação de uma ferramenta personalizada semelhante ao WSAT. Dan compartilha o código-fonte do aplicativo (em C#) e fornece instruções passo a passo para adicioná-lo ao seu site hospedado.

Resumo

Ao implantar um aplicativo Web que usa a implementação do banco de dados dos serviços de aplicativo, primeiro você deve garantir que o banco de dados de produção tenha os objetos de banco de dados necessários. Esses objetos podem ser adicionados usando as técnicas discutidas no tutorial Implantando um banco de dados; como alternativa, você pode usar a aspnet_regsql.exe ferramenta, como vimos neste tutorial. Outros desafios que abordamos giram em torno da sincronização do nome do aplicativo usado nos ambientes de desenvolvimento e produção (o que é importante se você quiser que usuários e funções criados no ambiente de desenvolvimento sejam válidos na produção) e técnicas para gerenciar os usuários e funções no ambiente de produção.

Programação feliz!

Leitura Adicional

Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos: