Compartilhar via


Como usar o Exemplo de Associação XML Somente Leitura e os Provedores de Função com o IIS 7.0

por Robert McMurray

Introdução

Quando o ASP.NET 2.0 foi lançado, o site MSDN (Microsoft Developer Network) forneceu dois provedores de exemplo para associação e funções do ASP.NET. Esses eram provedores somente leitura que usavam arquivos XML para a lista de usuários e funções e estavam disponíveis nas seguintes URLs:

Esses exemplos são excelentes para uso com o IIS 7.0 e versões superiores para sites de demonstração ou teste, mas não funcionam conforme escrito no IIS devido à maneira como a segurança foi projetada no IIS. As instruções originais permitiram que você implantasse os provedores de associação/função de exemplo na pasta App_Code do seu site, mas o IIS exige que os provedores sejam registrados no GAC (cache de assembly global) antes de serem implantados. Com isso em mente, as etapas a seguir orientarão você na compilação e implantação dos provedores XML somente leitura em um sistema de desenvolvimento.

Pré-requisitos

Os seguintes itens são necessários para ralizar os procedimentos nessa seção:

  1. O IIS 7.0 ou superior deve estar instalado em seu computador Windows Vista ou Windows Server 2008.
  2. O ASP.NET deve estar instalado de acordo com sua versão do IIS.
  3. O Gerenciador de Serviços de Informações da Internet para IIS 7.0 e versões superiores deve estar instalado.
  4. Você precisará do Gacutil.exe em seu computador do IIS. Isto é necessário para adicionar os assemblies ao GAC (cache de assembly global).

Etapa 1: configurar os projetos do provedor de XML

Nesta primeira etapa, você criará uma solução no Visual Studio que contém dois projetos: um para o provedor de associação baseado em XML e outro para o provedor de funções baseado em XML.

  1. Abra o Microsoft Visual Studio 2008.

  2. Clique no menu Arquivo, Novo e, em seguida, Projeto.

  3. Na caixa de diálogo Novo Projeto:

    • Escolha Visual C# como tipo de projeto.
    • Escolha Biblioteca de Classes como modelo.
    • Digite ReadOnlyXmlMembershipProvider como o nome do projeto.
    • Digite ReadOnlyXmlProviders como o nome da solução.
    • Clique em OK.
  4. Remova o arquivo Class1.cs do projeto ReadOnlyXmlMembershipProvider:

    • No gerenciador de soluções, clique com o botão direito do mouse no arquivo Class1.cs no projeto ReadOnlyXmlMembershipProvider e, em seguida, Excluir.
    • Clique em OK quando solicitado a excluir permanentemente a classe.
  5. Adicione um caminho de referência à biblioteca System.Configuration:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlMembershipProvider e, em seguida, Adicionar referência...
    • Clique na guia .NET.
    • Selecione "System.Configuration" na lista de assemblies.
    • Clique em OK.
  6. Adicione um caminho de referência para a biblioteca System.Web:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlMembershipProvider e, em seguida, Adicionar referência...
    • Clique na guia .NET.
    • Selecione "System.Web" na lista de assemblies.
    • Clique em OK.
  7. Adicione uma chave de nome forte ao projeto:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e em Propriedades.
    • Clique na guia Assinatura .
    • Marque a caixa de seleção Assinar o assembly.
    • Escolha <Novo...> na caixa suspensa do nome de chave forte.
    • Insira ReadOnlyXmlMembershipProviderKey para o nome do arquivo de chave.
    • Se desejar, insira uma senha para o arquivo de chave; caso contrário, desmarque a caixa Proteger meu arquivo de chave com uma senha.
    • Clique em OK.
  8. (Opcional) Adicione um evento de build personalizado para registrar automaticamente a DLL no GAC:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e em Propriedades.

    • Clique na guia Eventos de Build.

    • Insira o seguinte na caixa Linha de comando do evento pós-build:

      call "%VS90COMNTOOLS%\vsvars32.bat">nul
      gacutil.exe /if "$(TargetPath)"
      
  9. Adicione outro projeto à solução:

    • Clique em Arquivo, Adicionar e, em seguida, Novo Projeto...
    • Escolha Visual C# como tipo de projeto.
    • Escolha Biblioteca de Classes como modelo.
    • Digite ReadOnlyXmlRoleProvider como o nome do projeto.
    • Clique em OK.
  10. Remova o arquivo Class1.cs do projeto ReadOnlyXmlRoleProvider:

    • No gerenciador de soluções, clique com o botão direito do mouse no arquivo Class1.cs no projeto ReadOnlyXmlRoleProvider e, em seguida, Excluir.
    • Clique em OK quando solicitado a excluir permanentemente a classe.
  11. Adicione um caminho de referência à biblioteca System.Configuration:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e, em seguida, Adicionar Referência...
    • Clique na guia .NET.
    • Selecione "System.Configuration" na lista de assemblies.
    • Clique em OK.
  12. Adicione um caminho de referência para a biblioteca System.Web:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e, em seguida, Adicionar Referência...
    • Clique na guia .NET.
    • Selecione "System.Web" na lista de assemblies.
    • Clique em OK.
  13. Adicione uma chave de nome forte ao projeto:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e em Propriedades.
    • Clique na guia Assinatura .
    • Marque a caixa de seleção Assinar o assembly.
    • Escolha <Novo...> na caixa suspensa do nome de chave forte.
    • Insira ReadOnlyXmlRoleProvider para o nome do arquivo de chave.
    • Se desejar, insira uma senha para o arquivo de chave; caso contrário, desmarque a caixa Proteger meu arquivo de chave com uma senha.
    • Clique em OK.
  14. (Opcional) Adicione um evento de build personalizado para registrar automaticamente a DLL no GAC:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider e em Propriedades.

    • Clique na guia Eventos de Build.

    • Insira o seguinte na caixa Linha de comando do evento pós-build:

      call "%VS90COMNTOOLS%\vsvars32.bat">nul
      gacutil.exe /if "$(TargetPath)"
      
  15. Salve a solução.

Etapa 2: adicionar as classes de provedor para os projetos

Nesta segunda etapa, você criará as classes para os provedores de função e associação baseados em XML. O código dessas classes é copiado dos tópicos Provedores de Associação e Provedores de Função do MSDN.

  1. Adicione uma nova classe ao projeto ReadOnlyXmlMembershipProvider:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlMembershipProvider, Adicionar e, em seguida, Classe...

    • Nomeie a classe como ReadOnlyXmlMembershipProvider.cs.

    • Clique em Adicionar.

    • Remova o código existente.

    • Cole o seguinte código de exemplo do tópico Provedores de Associação no editor:

      using System;
      using System.Xml;
      using System.Collections.Generic;
      using System.Collections.Specialized;
      using System.Configuration.Provider;
      using System.Web.Security;
      using System.Web.Hosting;
      using System.Web.Management;
      using System.Security.Permissions;
      using System.Web;
      
      public class ReadOnlyXmlMembershipProvider : MembershipProvider
      {
         private Dictionary<string, MembershipUser> _Users;
         private string _XmlFileName;
      
         // MembershipProvider Properties
         public override string ApplicationName
         {
            get { throw new NotSupportedException(); }
            set { throw new NotSupportedException(); }
         }
      
         public override bool EnablePasswordRetrieval
         {
            get { return false; }
         }
      
         public override bool EnablePasswordReset
         {
            get { return false; }
         }
      
         public override int MaxInvalidPasswordAttempts
         {
            get { throw new NotSupportedException(); }
         }
      
         public override int MinRequiredNonAlphanumericCharacters
         {
            get { throw new NotSupportedException(); }
         }
      
         public override int MinRequiredPasswordLength
         {
            get { throw new NotSupportedException(); }
         }
      
         public override int PasswordAttemptWindow
         {
            get { throw new NotSupportedException(); }
         }
      
         public override MembershipPasswordFormat PasswordFormat
         {
            get { throw new NotSupportedException(); }
         }
      
         public override string PasswordStrengthRegularExpression
         {
            get { throw new NotSupportedException(); }
         }
      
         public override bool RequiresQuestionAndAnswer
         {
            get { throw new NotSupportedException(); }
         }
      
         public override bool RequiresUniqueEmail
         {
            get { throw new NotSupportedException(); }
         }
      
         // MembershipProvider Methods
         public override void Initialize(string name,
            NameValueCollection config)
         {
            // Verify that config isn't null
            if (config == null)
               throw new ArgumentNullException("config");
            // Assign the provider a default name if it doesn't have one
            if (String.IsNullOrEmpty(name))
               name = "ReadOnlyXmlMembershipProvider";
            // Add a default "description" attribute to config if the
            // attribute doesn't exist or is empty
            if (string.IsNullOrEmpty(config["description"]))
            {
               config.Remove("description");
               config.Add("description",
                  "Read-only XML membership provider");
            }
            // Call the base class's Initialize method
            base.Initialize(name, config);
            // Initialize _XmlFileName and make sure the path
            // is app-relative
            string path = config["xmlFileName"];
            if (String.IsNullOrEmpty(path))
               path = "~/App_Data/Users.xml";
            if (!VirtualPathUtility.IsAppRelative(path))
               throw new ArgumentException
                  ("xmlFileName must be app-relative");
            string fullyQualifiedPath = VirtualPathUtility.Combine
               (VirtualPathUtility.AppendTrailingSlash
               (HttpRuntime.AppDomainAppVirtualPath), path);
            _XmlFileName = HostingEnvironment.MapPath(fullyQualifiedPath);
            config.Remove("xmlFileName");
            // Make sure we have permission to read the XML data source and
            // throw an exception if we don't
            FileIOPermission permission =
               new FileIOPermission(FileIOPermissionAccess.Read,
                  _XmlFileName);
            permission.Demand();
            // Throw an exception if unrecognized attributes remain
            if (config.Count > 0)
            {
               string attr = config.GetKey(0);
               if (!String.IsNullOrEmpty(attr))
                  throw new ProviderException
                      ("Unrecognized attribute: " + attr);
            }
         }
      
         public override bool ValidateUser(string username, string password)
         {
            // Validate input parameters
            if (String.IsNullOrEmpty(username) ||
               String.IsNullOrEmpty(password))
                  return false;
            try
            {
               // Make sure the data source has been loaded
               ReadMembershipDataStore();
               // Validate the user name and password
               MembershipUser user;
               if (_Users.TryGetValue(username, out user))
               {
                  if (user.Comment == password) // Case-sensitive
                  {
                     // NOTE: A read/write membership provider
                     // would update the user's LastLoginDate here.
                     // A fully featured provider would also fire
                     // an AuditMembershipAuthenticationSuccess
                     // Web event
                     return true;
                  }
               }
               // NOTE: A fully featured membership provider would
               // fire an AuditMembershipAuthenticationFailure
               // Web event here
               return false;
            }
            catch (Exception)
            {
               return false;
            }
         }
      
         public override MembershipUser GetUser(string username,
            bool userIsOnline)
         {
            // Note: This implementation ignores userIsOnline
            // Validate input parameters
               if (String.IsNullOrEmpty(username))
               return null;
            // Make sure the data source has been loaded
            ReadMembershipDataStore();
            // Retrieve the user from the data source
            MembershipUser user;
            if (_Users.TryGetValue(username, out user))
               return user;
            return null;
         }
      
         public override MembershipUserCollection GetAllUsers(int pageIndex,
            int pageSize, out int totalRecords)
         {
            // Note: This implementation ignores pageIndex and pageSize,
            // and it doesn't sort the MembershipUser objects returned
            // Make sure the data source has been loaded
            ReadMembershipDataStore();
            MembershipUserCollection users =
               new MembershipUserCollection();
            foreach (KeyValuePair<string, MembershipUser> pair in _Users)
               users.Add(pair.Value);
            totalRecords = users.Count;
            return users;
         }
      
         public override int GetNumberOfUsersOnline()
         {
            throw new NotSupportedException();
         }
      
         public override bool ChangePassword(string username,
            string oldPassword, string newPassword)
         {
            throw new NotSupportedException();
         }
      
         public override bool
            ChangePasswordQuestionAndAnswer(string username,
            string password, string newPasswordQuestion,
            string newPasswordAnswer)
         {
            throw new NotSupportedException();
         }
      
         public override MembershipUser CreateUser(string username,
            string password, string email, string passwordQuestion,
            string passwordAnswer, bool isApproved, object providerUserKey,
            out MembershipCreateStatus status)
         {
            throw new NotSupportedException();
         }
      
         public override bool DeleteUser(string username,
            bool deleteAllRelatedData)
         {
            throw new NotSupportedException();
         }
      
         public override MembershipUserCollection
            FindUsersByEmail(string emailToMatch, int pageIndex,
            int pageSize, out int totalRecords)
         {
            throw new NotSupportedException();
         }
      
         public override MembershipUserCollection
            FindUsersByName(string usernameToMatch, int pageIndex,
            int pageSize, out int totalRecords)
         {
            throw new NotSupportedException();
         }
      
         public override string GetPassword(string username, string answer)
         {
            throw new NotSupportedException();
         }
      
         public override MembershipUser GetUser(object providerUserKey,
            bool userIsOnline)
         {
            throw new NotSupportedException();
         }
      
         public override string GetUserNameByEmail(string email)
         {
            throw new NotSupportedException();
         }
      
         public override string ResetPassword(string username,
            string answer)
         {
            throw new NotSupportedException();
         }
      
         public override bool UnlockUser(string userName)
         {
            throw new NotSupportedException();
         }
      
         public override void UpdateUser(MembershipUser user)
         {
            throw new NotSupportedException();
         }
      
         // Helper method
         private void ReadMembershipDataStore()
         {
            lock (this)
            {
               if (_Users == null)
               {
                  _Users = new Dictionary<string, MembershipUser>
                     (16, StringComparer.InvariantCultureIgnoreCase);
                  XmlDocument doc = new XmlDocument();
                  doc.Load(_XmlFileName);
                  XmlNodeList nodes = doc.GetElementsByTagName("User");
                  foreach (XmlNode node in nodes)
                  {
                     MembershipUser user = new MembershipUser(
                        Name,                       // Provider name
                        node["UserName"].InnerText, // Username
                        null,                       // providerUserKey
                        node["EMail"].InnerText,    // Email
                        String.Empty,               // passwordQuestion
                        node["Password"].InnerText, // Comment
                        true,                       // isApproved
                        false,                      // isLockedOut
                        DateTime.Now,               // creationDate
                        DateTime.Now,               // lastLoginDate
                        DateTime.Now,               // lastActivityDate
                        DateTime.Now,               // lastPasswordChangedDate
                        new DateTime(1980, 1, 1)    // lastLockoutDate
                     );
                     _Users.Add(user.UserName, user);
                  }
               }
            }
         }
      }
      
  2. Adicione uma nova classe ao projeto ReadOnlyXmlRoleProvider:

    • No gerenciador de soluções, clique com o botão direito do mouse no projeto ReadOnlyXmlRoleProvider, Adicionar e, em seguida, Classe...

    • Nomeie a classe como ReadOnlyXmlRoleProvider.cs.

    • Clique em Adicionar.

    • Remova o código existente.

    • Cole o seguinte código de exemplo do tópico Provedores de Função no editor:

      using System;
      using System.Web.Security;
      using System.Collections.Generic;
      using System.Collections.Specialized;
      using System.Configuration.Provider;
      using System.Web.Hosting;
      using System.Xml;
      using System.Security.Permissions;
      using System.Web;
      
      public class ReadOnlyXmlRoleProvider : RoleProvider
      {
         private Dictionary<string, string[]> _UsersAndRoles =
         new Dictionary<string, string[]>(16,
         StringComparer.InvariantCultureIgnoreCase);
      
         private Dictionary<string, string[]> _RolesAndUsers =
            new Dictionary<string, string[]>(16,
            StringComparer.InvariantCultureIgnoreCase);
      
         private string _XmlFileName;
      
         // RoleProvider properties
         public override string ApplicationName
         {
            get { throw new NotSupportedException(); }
            set { throw new NotSupportedException(); }
         }
      
         // RoleProvider methods
         public override void Initialize(string name,
         NameValueCollection config)
         {
            // Verify that config isn't null
            if (config == null)
               throw new ArgumentNullException("config");
            // Assign the provider a default name if it doesn't have one
            if (String.IsNullOrEmpty(name))
               name = "ReadOnlyXmlRoleProvider";
            // Add a default "description" attribute to config if the
            // attribute doesn't exist or is empty
            if (string.IsNullOrEmpty(config["description"]))
            {
               config.Remove("description");
               config.Add("description", "Read-only XML role provider");
            }
            // Call the base class's Initialize method
            base.Initialize(name, config);
            // Initialize _XmlFileName and make sure the path
            // is app-relative
            string path = config["xmlFileName"];
            if (String.IsNullOrEmpty(path))
               path = "~/App_Data/Users.xml";
            if (!VirtualPathUtility.IsAppRelative(path))
               throw new ArgumentException
                  ("xmlFileName must be app-relative");
            string fullyQualifiedPath = VirtualPathUtility.Combine
               (VirtualPathUtility.AppendTrailingSlash
               (HttpRuntime.AppDomainAppVirtualPath), path);
            _XmlFileName = HostingEnvironment.MapPath(fullyQualifiedPath);
            config.Remove("xmlFileName");
            // Make sure we have permission to read the XML data source and
            // throw an exception if we don't
            FileIOPermission permission =
               new FileIOPermission(FileIOPermissionAccess.Read,
                  _XmlFileName);
            permission.Demand();
            // Throw an exception if unrecognized attributes remain
            if (config.Count > 0)
            {
               string attr = config.GetKey(0);
               if (!String.IsNullOrEmpty(attr))
                  throw new ProviderException
                     ("Unrecognized attribute: " + attr);
            }
            // Read the role data source. NOTE: Unlike
            // ReadOnlyXmlMembershipProvider, this provider can
            // read the data source at this point because Read-
            // RoleDataStore doesn't call into the role manager
            ReadRoleDataStore();
         }
      
         public override bool IsUserInRole(string username, string roleName)
         {
            // Validate input parameters
            if (username == null || roleName == null)
               throw new ArgumentNullException();
            if (username == String.Empty || roleName == string.Empty)
               throw new ArgumentException();
            // Make sure the user name and role name are valid
            if (!_UsersAndRoles.ContainsKey(username))
               throw new ProviderException("Invalid user name");
            if (!_RolesAndUsers.ContainsKey(roleName))
               throw new ProviderException("Invalid role name");
            // Determine whether the user is in the specified role 
            string[] roles = _UsersAndRoles[username];
            foreach (string role in roles)
            {
               if (String.Compare(role, roleName, true) == 0)
                  return true;
            }
            return false;
         }
      
         public override string[] GetRolesForUser(string username)
         {
            // Validate input parameters
            if (username == null)
               throw new ArgumentNullException();
            if (username == string.Empty)
               throw new ArgumentException();
            // Make sure the user name is valid
            string[] roles;
            if (!_UsersAndRoles.TryGetValue(username, out roles))
               throw new ProviderException("Invalid user name");
            // Return role names
            return roles;
         }
      
         public override string[] GetUsersInRole(string roleName)
         {
            // Validate input parameters
            if (roleName == null)
               throw new ArgumentNullException();
            if (roleName == string.Empty)
            throw new ArgumentException();
            // Make sure the role name is valid
            string[] users;
            if (!_RolesAndUsers.TryGetValue(roleName, out users))
               throw new ProviderException("Invalid role name");
            // Return user names
            return users;
         }
      
         public override string[] GetAllRoles()
         {
            int i = 0;
            string[] roles = new string[_RolesAndUsers.Count];
            foreach (KeyValuePair<string, string[]> pair in _RolesAndUsers)
               roles[i++] = pair.Key;
            return roles;
         }
      
         public override bool RoleExists(string roleName)
         {
            // Validate input parameters
            if (roleName == null)
               throw new ArgumentNullException();
            if (roleName == string.Empty)
               throw new ArgumentException();
            // Determine whether the role exists
            return _RolesAndUsers.ContainsKey(roleName);
         }
      
         public override void CreateRole(string roleName)
         {
            throw new NotSupportedException();
         }
      
         public override bool DeleteRole(string roleName,
            bool throwOnPopulatedRole)
         {
            throw new NotSupportedException();
         }
      
         public override void AddUsersToRoles(string[] usernames,
            string[] roleNames)
         {
            throw new NotSupportedException();
         }
      
         public override string[] FindUsersInRole(string roleName,
            string usernameToMatch)
         {
            throw new NotSupportedException();
         }
      
         public override void RemoveUsersFromRoles(string[] usernames,
            string[] roleNames)
         {
            throw new NotSupportedException();
         }
      
         // Helper method
         private void ReadRoleDataStore()
         {
            XmlDocument doc = new XmlDocument();
            doc.Load(_XmlFileName);
            XmlNodeList nodes = doc.GetElementsByTagName("User");
            foreach (XmlNode node in nodes)
            {
               if (node["UserName"] == null)
                  throw new ProviderException
                     ("Missing UserName element");
               string user = node["UserName"].InnerText;
               if (String.IsNullOrEmpty(user))
                  throw new ProviderException("Empty UserName element");
               if (node["Roles"] == null ||
                  String.IsNullOrEmpty(node["Roles"].InnerText))
                     _UsersAndRoles.Add(user, new string[0]);
               else
               {
                  string[] roles = node["Roles"].InnerText.Split(',');
                  // Add the role names to _UsersAndRoles and
                  // key them by user name
                  _UsersAndRoles.Add(user, roles);
                  foreach (string role in roles)
                  {
                     // Add the user name to _RolesAndUsers and
                     // key it by role names
                     string[] users1;
                     if (_RolesAndUsers.TryGetValue(role, out users1))
                     {
                        string[] users2 =
                           new string[users1.Length + 1];
                        users1.CopyTo(users2, 0);
                        users2[users1.Length] = user;
                        _RolesAndUsers.Remove(role);
                        _RolesAndUsers.Add(role, users2);
                     }
                     else
                        _RolesAndUsers.Add(role,
                     new string[] { user });
                  }
               }
            }
         }
      }
      
  3. Salve e compile ambos os projetos.

Observação

Se você não tiver usado as etapas opcionais para registrar os assemblies no GAC, será necessário copiar manualmente os assemblies para o computador do IIS e adicionar os assemblies ao GAC usando a ferramenta Gacutil.exe. Para obter mais informações, consulte o seguinte tópico no site do MSDN da Microsoft:

Etapa 3: adicionar o provedor ao IIS

Nesta terceira etapa, você determinará as informações de assembly para os provedores de funções e associação e, em seguida, adicionará essas informações à lista de provedores confiáveis do IIS.

  1. Determine as informações do assembly para os dois provedores:

    • No Windows Explorer, abra o caminho C:\Windows\assembly, em que C: é a unidade do sistema operacional.
    • Localize os assemblies ReadOnlyXmlMembershipProvider e ReadOnlyXmlRoleProvider.
    • Clique com o botão direito do mouse em cada assembly e selecione Propriedades.
    • Copie os valores de Cultura, por exemplo: Neutro.
    • Copie os números de Versão, por exemplo: 1.0.0.0.
    • Copie os valores de Token de Chave Pública, por exemplo: 426f62526f636b73.
    • Clique em Cancelar.
  2. Adicione os provedores XML à lista de provedores confiáveis do IIS:

    • Abra o arquivo Administration.config para edição.

      Observação

      Esse arquivo está localizado em sua pasta %WinDir%\System32\Inetsrv\Config.

    • Adicione os provedores com as propriedades do assembly das etapas anteriores à seção <trustedProviders> usando a seguinte sintaxe:

      <add type="ReadOnlyXmlMembershipProvider, ReadOnlyXmlMembershipProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73" />
      
      <add type="ReadOnlyXmlRoleProvider, ReadOnlyXmlRoleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73" />
      
    • Salve e feche o arquivo Administration.config.

Etapa 4: configurar um site para Autenticação de Formulários usando os provedores XML

Nesta quarta etapa, você configurará um site da Web para usar a autenticação de formulários com os provedores de função e associação baseados em XML criando manualmente um arquivo Web.config para seu site, adicionando um arquivo XML com a lista de usuários à pasta App_Data do site e adicionando uma página Login.aspx ao site que processará solicitações de autenticação de formulários.

  1. Crie um arquivo XML para os usuários e funções associados:

    • Cole o seguinte código em um editor de texto:

      <Users>
         <User>
            <UserName>Bob</UserName>
            <Password>contoso!</Password>
            <EMail>bob@contoso.com</EMail>
            <Roles>Members</Roles>
         </User>
         <User>
            <UserName>Alice</UserName>
            <Password>contoso!</Password>
            <EMail>alice@contoso.com</EMail>
            <Roles>Members,Administrators</Roles>
         </User>
      </Users>
      
    • Salve o código como "Users.xml" na pasta App_Data do site.

  2. Crie um arquivo Login.aspx para seu site:

    • Cole o seguinte código em um editor de texto:

      <%@ Page Language="C#" %>
      <%@ Import Namespace="System.ComponentModel" %>
      <html>
      <head runat="server">
      <title>Login Page</title>
      </head>
      <body>
         <form id="form1" runat="server">
            <asp:Login id="Login1" runat="server"
                  BorderStyle="Solid"
                  BackColor="#ffffcc"
                  BorderWidth="1px"
                  BorderColor="#cccc99"
                  Font-Size="10pt"
                  Font-Names="Verdana">
               <TitleTextStyle Font-Bold="True"
                  ForeColor="#ffffff"
                  BackColor="#666666"/>
            </asp:Login>
         </form>
      </body>
      </html>
      
    • Salve o código como "Login.aspx" na raiz do seu site.

  3. Crie um arquivo Web.config para o site:

    • Cole o seguinte código em um editor de texto:

      <configuration>
         <system.web>
            <!-- Add the read-only XML membership provider and set it as the default. -->
            <membership defaultProvider="AspNetReadOnlyXmlMembershipProvider">
               <providers>
                  <add name="AspNetReadOnlyXmlMembershipProvider"
                     type="ReadOnlyXmlMembershipProvider, ReadOnlyXmlMembershipProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=91454274822e8111"
                     description="Read-only XML membership provider"
                     xmlFileName="~/App_Data/Users.xml" />
               </providers>
            </membership>
            <!-- Add the read-only XML role provider and set it as the default. -->
            <roleManager enabled="true" defaultProvider="AspNetReadOnlyXmlRoleProvider">
               <providers>
                  <add name="AspNetReadOnlyXmlRoleProvider"
                     type="ReadOnlyXmlRoleProvider, ReadOnlyXmlRoleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a9c0f8ad39898a3c"
                     description="Read-only XML role provider"
                     xmlFileName="~/App_Data/Users.xml" />
               </providers>
            </roleManager>
            <!-- Set the authentication mode to forms authentication. -->
            <authentication mode="Forms" />
         </system.web>
         <system.webServer>
            <!-- Configure the authentication and roles modules for all content. -->
            <modules>
               <remove name="RoleManager" />
               <remove name="DefaultAuthentication" />
               <remove name="FormsAuthentication" />
               <add name="FormsAuthentication"
                  type="System.Web.Security.FormsAuthenticationModule"
                  preCondition="" />
               <add name="DefaultAuthentication"
                  type="System.Web.Security.DefaultAuthenticationModule"
                  preCondition="" />
               <add name="RoleManager"
                  type="System.Web.Security.RoleManagerModule"
                  preCondition="" />
            </modules>
            <!-- Add authorization rules for membership roles. -->
            <security>
               <authorization>
                  <clear />
                  <add accessType="Allow" roles="Administrators" />
                  <add accessType="Allow" roles="Members" />
               </authorization>
            </security>
         </system.webServer>
      </configuration>
      

      Observação

      Os valores PublicKeyToken nas seções <providers> em que seu web.config deve corresponder aos valores PublicKeyToken na seção <trustedProviders> do arquivo Administration.config.

    • Salve o código como "Web.config" na raiz do seu site.

Resumo

Neste passo a passo, você realizou o seguinte:

  • Configurou dois projetos de classe no Visual Studio 2008 para os provedores de função e associação XML somente leitura.
  • Compilou os projetos e os adicionou ao cache de assembly global.
  • Adicionou os provedores de funções e associação XML como provedores confiáveis para o IIS.
  • Configurou um site para Autenticação de Formulários usando os provedores XML.