2012-10-11 13 views
5

Sto avendo un'applicazione web .net che utilizza l'appartenenza per le convalide degli utenti. L'appartenenza ha una definizione nel file web.config e fa riferimento a una stringa di connessione nel file (web.config), ho bisogno di impostare la stringa di connessione dell'abbonamento dal codice in modo dinamico per non essere statica nel web.config.Imposta dinamicamente la stringa di appartenenza dall'appartenenza al codice

Come posso farlo?

Grazie in anticipo.

risposta

5

Il seguente codice di esempio C# dimostra come configure a .NET membership provider programmatically per Jacques L. Chereau. Questo codice richiede che si anche configure a connection string nominato 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); 

Supponendo di avere i seguenti riferimenti di libreria:

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

EDIT:

Questo metodo imposta la stringa di connessione nei provider Membership presto sufficiente nel ciclo di vita della richiesta

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); 

} 

Non testato ma chiamando questo metodo da Global.asax.cs all'interno di Application_PreRequestHandlerExecute fa il lavoro.

+0

Ma come impostare la stringa di connessione? ho bisogno di fare riferimento alla stringa di connessione dal codice non nel web.config, voglio dire che ho bisogno dell'appartenenza per leggere la stringa di connessione dal codice non dal file web.config. Quindi dal tuo codice non riesco a trovare come è supportata la stringa di connessione per l'appartenenza? Non ho bisogno di scrivere la stringa di connessione nel web.config – Ahmy

+0

Ho modificato la mia risposta per includere il metodo – chridam

+1

Grazie troppo funziona correttamente come ho desiderato grazie ancora. – Ahmy

2

C'è una soluzione molto più facile a questo.

  1. Creare una classe figlio che estende la classe SqlMembershipProvider.
  2. Override Initialize metodo
  3. Set ConnectionString config proprietà [ "connectionString"]
  4. Lasciate che la logica base.Initialize continuare
  5. Nel file web.config, invece di SqlMembershipProvider, utilizzare la classe personalizzato. (se gli dai un nome diverso, assicurati di impostare l'attributo defaultProvider corrispondente)
Problemi correlati