2012-10-11 13 views
5

Tengo una aplicación web .net que utiliza membresía para las validaciones de los usuarios. La membresía tiene una definición en el archivo web.config y se refiere a una cadena de conexión en el archivo (web.config). Necesito configurar la cadena de conexión de la membresía desde el código de forma dinámica para que no sea estática en el web.config.Establecer la cadena de conexión de membresía de forma dinámica desde el código

¿Cómo puedo hacer eso?

Gracias de antemano.

Respuesta

5

El siguiente código de muestra C# demuestra cómo configure a .NET membership provider programmatically por Jacques L. Chereau. Este código requiere que también configure a connection string nombrado MyDatabase

NameValueCollection objConfig = new NameValueCollection(); 
objConfig.Add("connectionStringName", "MyDatabase"); 
objConfig.Add("enablePasswordRetrieval", "false"); 
objConfig.Add("enablePasswordReset", "true"); 
objConfig.Add("requiresQuestionAndAnswer", "true"); 
objConfig.Add("applicationName", "MyApp"); 
objConfig.Add("requiresUniqueEmail", "true"); 
objConfig.Add("maxInvalidPasswordAttempts", "5"); 
objConfig.Add("passwordAttemptWindow", "10"); 
objConfig.Add("commandTimeout", "30"); 
objConfig.Add("passwordFormat", "Hashed"); 
objConfig.Add("name", "AspNetSqlMembershipProvider"); 
objConfig.Add("minRequiredPasswordLength", "8"); 
objConfig.Add("minRequiredNonalphanumericCharacters", "2"); 
objConfig.Add("passwordStrengthRegularExpression", "(?=^.{8,25}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]#$%^&*()_+}{\\":;'?/>.<,])(?!.*\\s).*$")); 

SqlMembershipProvider objSqlMembershipProvider = new SqlMembershipProvider(); 
objSqlMembershipProvider.Initialize(objConfig["name"], objConfig); 
MembershipProviderCollection colMembershipProviders = new MembershipProviderCollection(); 
colMembershipProviders.Add(objSqlMembershipProvider); 
colMembershipProviders.SetReadOnly(); 

BindingFlags enuBindingFlags = BindingFlags.NonPublic | BindingFlags.Static; 
Type objMembershipType = typeof(Membership); 
objMembershipType.GetField("s_Initialized", enuBindingFlags).SetValue(null, true); 
objMembershipType.GetField("s_InitializeException", enuBindingFlags).SetValue(null, null); 
objMembershipType.GetField("s_HashAlgorithmType", enuBindingFlags).SetValue(null, "SHA1"); 
objMembershipType.GetField("s_HashAlgorithmFromConfig", enuBindingFlags).SetValue(null, false); 
objMembershipType.GetField("s_UserIsOnlineTimeWindow", enuBindingFlags).SetValue(null, 15); 
objMembershipType.GetField("s_Provider", enuBindingFlags).SetValue(null, objSqlMembershipProvider); 
objMembershipType.GetField("s_Providers", enuBindingFlags).SetValue(null, colMembershipProviders); 

Asumiendo que tiene las siguientes referencias de biblioteca:

using System.Web.Security; 
using System.Collections.Specialized; 
using System.Reflection; 

EDIT:

Este método establece la cadena de conexión de los proveedores de pertenencia temprana suficiente en el ciclo de vida de la solicitud

private void SetMembershipProviderConnectionString(string connectionString) 
{ 
    // Set private property of Membership. Untested code!! 
    var connectionStringField = Membership.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
    if (connectionStringField != null) 
     connectionStringField.SetValue(Membership.Provider, connectionString); 

} 

No probado pero llamando a este método desde Global.asax.cs dentro de Application_PreRequestHandlerExecute hace el trabajo.

+0

¿Pero cómo establecer la cadena de conexión? Necesito referirme a la cadena de conexión del código que no está en el web.config, quiero decir que necesito que la membresía lea la cadena de conexión del código no del archivo web.config. Entonces, de su código no puedo encontrar cómo se admite la cadena de conexión a la membresía? No necesito escribir una cadena de conexión en el archivo web.config – Ahmy

+0

He editado mi respuesta para incluir el método – chridam

+1

Muchas gracias, funciona correctamente, ya que deseo agradecer nuevamente. – Ahmy

2

Hay una solución mucho más fácil para esto.

  1. Cree una clase secundaria que amplíe la clase SqlMembershipProvider.
  2. Anulación método initialize
  3. Conjunto connectionString config propiedad [ "connectionString"]
  4. Deje que la lógica base.Initialize continuar
  5. En el archivo web.config, en lugar de SqlMembershipProvider, utilice su clase personalizado. (si le da un nombre diferente, asegúrese de establecer el atributo defaultProvider para que coincida con)
Cuestiones relacionadas