2012-09-14 14 views
10

Tener un momento sin código.¿Qué proveedor de membresía implementa usuarios almacenados en web.config?

ASP.NET 4.0.

Web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms name="DataViewer" loginUrl="login.aspx"> 
     <credentials passwordFormat="Clear"> 
      <user name="devuser" password="test" /> 
     </credentials> 
     </forms> 
    </authentication> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 

y un control de entrada:

<asp:Login ID="login" runat="server" /> 

Si entro en un nombre de usuario y contraseña, y haga clic en Inicio de sesión, se cuelga.

Si rompo, puedo ver en la pila de llamadas que login.AuthenticateUsingMembershipProvider() está en el medio de llamar al SqlMembershipProvider.ValidateUser(). No hay ninguna base de datos definida o involucrada en este proyecto en absoluto, y no he especificado que se use SqlMembershipProvider.

Así que mi pregunta es, ¿qué proveedor de membresía debo usar para que ASP.NET use los nombres de usuario y las contraseñas en el elemento <credentials> de web.config?

+0

puede ser porque por defecto del proveedor de pertenencia es el AspNetSqlProvider que utiliza una base de datos SQL Server como su almacén de usuarios. – Scorpio

+0

Espero que esta sea una solución temporal. Será muy difícil mantener las credenciales en web.config ya que cada cambio reiniciará la aplicación web. – jrummell

+0

Por supuesto. Sin embargo, es adecuado para el escenario en cuestión.Necesito brindar protección trivial a una aplicación simple para un solo usuario (siempre) cuya contraseña nunca cambiará. Una solución con mayores dependencias no es apropiada. – tomfanning

Respuesta

14

Me sorprende que, teniendo en cuenta cómo los diseñadores de frameworks se tomaron la molestia de definir un elemento <credentials />, no implementaron ningún código para consumirlo.

Encontré una implementación de tipo de trabajo de este here que he arreglado e incluido a continuación. Todos los demás miembros de MembershipProvider lanzan NotImplementedException.

using System.Configuration; 
using System.Web.Configuration; 
using System.Web.Security; 

public class WebConfigMembershipProvider : MembershipProvider 
{ 
    private FormsAuthenticationUserCollection _users = null; 
    private FormsAuthPasswordFormat _passwordFormat; 

    public override void Initialize(string name, 
     System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 
     _passwordFormat = getPasswordFormat(); 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     var user = getUsers()[username]; 
     if (user == null) return false; 

     if (_passwordFormat == FormsAuthPasswordFormat.Clear) 
     { 
      if (user.Password == password) 
      { 
       return true; 
      } 
     } 
     else 
     { 
      if (user.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password, 
       _passwordFormat.ToString())) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    protected FormsAuthenticationUserCollection getUsers() 
    { 
     if (_users == null) 
     { 
      AuthenticationSection section = getAuthenticationSection(); 
      FormsAuthenticationCredentials creds = section.Forms.Credentials; 
      _users = section.Forms.Credentials.Users; 
     } 
     return _users; 
    } 

    protected AuthenticationSection getAuthenticationSection() 
    { 
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
     return (AuthenticationSection)config.GetSection("system.web/authentication"); 
    } 

    protected FormsAuthPasswordFormat getPasswordFormat() 
    { 
     return getAuthenticationSection().Forms.Credentials.PasswordFormat; 
    } 
} 
+1

¡Eres un tipo! – sbeskur

+0

De nada :-) – tomfanning

+0

Estaba a punto de utilizar el método obsoleto FormsAuthentication.Authenticate. Gracias por poner la clase aquí. – strider

3

Va a necesitar escribir su propio proveedor para esto. Debería ser relativamente sencillo tomar la muestra ReadOnlyXmlMembershipProvider en el MSDN documentation y cambiarla para leer los usuarios y las credenciales de web.config, en lugar de un archivo XML externo.

2

No estoy seguro de si ha intentado, pero ....

El FormsAuthentication.Authenticate se encarga de hacer eso por usted (aunque ahora está en desuso debido a que el comportamiento recomendado es utilizar la membresía objeto)

de MSDN:

método el Authenticate verifica las credenciales de usuario que se almacenan en la sección de credenciales del archivo de configuración de la aplicación. Alternativamente, puede usar la membresía de ASP.NET para almacenar credenciales de usuario y llamar al ValidateUser para verificar las credenciales.

También puede eliminar los proveedores de pertenencia (porque incluso cuando no se declara en tu web.config, que se heredan del archivo machine.config)

<membership> 
    <providers> 
     <remove name="AspNetSqlMembershipProvider"/> 
    </providers> 
    </membership> 
Cuestiones relacionadas