Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Provedores de associaçãohttps://msdn.microsoft.com/library/aa479031.aspx
- Provedores de funçãohttps://msdn.microsoft.com/library/aa479032.aspx
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:
- O IIS 7.0 ou superior deve estar instalado em seu computador Windows Vista ou Windows Server 2008.
- O ASP.NET deve estar instalado de acordo com sua versão do IIS.
- O Gerenciador de Serviços de Informações da Internet para IIS 7.0 e versões superiores deve estar instalado.
- 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.
Abra o Microsoft Visual Studio 2008.
Clique no menu Arquivo, Novo e, em seguida, Projeto.
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.
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.
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.
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.
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.
(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)"
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.
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.
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.
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.
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.
(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)"
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.
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); } } } } }
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 }); } } } } }
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.
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.
- No Windows Explorer, abra o caminho
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.
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.
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.
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.