2012-10-11 18 views
5

Mam aplikację sieci .net, która używa członkostwa dla sprawdzania użytkowników. Członkostwo ma definicję w pliku web.config i odnosi się do łańcucha połączenia w pliku (web.config), muszę ustawić ciąg połączenia członkostwa z kodu dynamicznie nie być statyczny w web.config.Ustaw dynamicznie ciąg połączenia członkostwa z kodem

Jak mogę to zrobić?

Z góry dziękuję.

Odpowiedz

5

Poniższy przykładowy kod języka C# pokazuje, jak configure a .NET membership provider programmatically przez Jacques L. Chereau. Ten kod wymaga również configure a connection string nazwie 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); 

Zakładając, że mamy następujące odniesienia Biblioteka:

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

EDIT:

Ta metoda ustawia ciąg połączenia w dostawców członkostwa wcześnie Wystarczająco dużo w cyklu życiowym żądania

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

} 

Nie testowano, ale wywołanie tej metody z Global.asax.cs wewnątrz Application_PreRequestHandlerExecute wykonuje zadanie.

+0

Ale jak ustawić ciąg połączenia? Muszę odwołać się do ciągu połączenia z kodu nie w web.config, to znaczy, że potrzebuję członkostwa, aby odczytać ciąg połączenia z kodu nie z pliku web.config. Więc z Twojego kodu nie mogę znaleźć, w jaki sposób ciąg połączenia jest obsługiwany przez członkostwo? Nie muszę pisać ciągu połączenia w web.config – Ahmy

+0

Edytowałem swoją odpowiedź, aby uwzględnić metodę – chridam

+1

. Dziękuję za dużo, że działa poprawnie, ponieważ pragnąłem ponownie. – Ahmy

2

Istnieje o wiele łatwiejsze rozwiązanie tego problemu.

  1. Utwórz klasę podrzędną rozszerzającą klasę SqlMembershipProvider.
  2. Zastąp Initialize metoda
  3. zestaw ConnectionString właściwość config [ "connectionString"]
  4. Niech logika base.Initialize kontynuować
  5. W pliku web.config, zamiast SqlMembershipProvider, używać klasy niestandardową. (jeśli nadasz mu inną nazwę, upewnij się, że ustawiłeś atrybut defaultProvider na taki sam).