2012-10-11 9 views
5

Ich habe eine .net Webanwendung, die Mitgliedschaft für Benutzer Validierungen verwendet. Die Mitgliedschaft hat eine Definition in der Datei web.config und verweist auf eine Verbindungszeichenfolge in der Datei (web.config). Ich muss die Verbindungszeichenfolge der Mitgliedschaft dynamisch aus dem Code in der web.config nicht statisch festlegen.Setzen Sie die Verbindungszeichenfolge der Mitgliedschaft dynamisch aus dem Code

Wie kann ich das tun?

Vielen Dank im Voraus.

Antwort

5

Der folgende C# -Beispielcode veranschaulicht, wie configure a .NET membership provider programmatically von Jacques L. Chereau. Dieser Code erfordert, dass Sie configure a connection string auch MyDatabase genannt

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

Angenommen, Sie folgende Bibliothek Referenzen haben:

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

EDIT:

Diese Methode die Verbindungszeichenfolge in den Membership-Provider setzt früh genug im Lebenszyklus der Anforderung

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

} 

Nicht getestet, aber Aufruf dieser Methode von Global.asax.cs innerhalb Application_PreRequestHandlerExecute erledigt den Job.

+0

Wie wird die Verbindungszeichenfolge festgelegt? Ich muss auf Verbindungszeichenfolge vom Code beziehen, der nicht in der web.config ist, ich meine, dass ich die Mitgliedschaft brauche, um Verbindungszeichenfolge vom Code nicht von web.config-Datei zu lesen. Also von Ihrem Code kann ich nicht finden, wie wird die Verbindungszeichenfolge für die Mitgliedschaft unterstützt? Ich muss keine Verbindungszeichenfolge in der web.config schreiben – Ahmy

+0

Ich habe meine Antwort bearbeitet, um die Methode – chridam

+1

zu enthalten Dank zu viel funktioniert es richtig, wie ich wünschte, danke wieder. – Ahmy

2

Es gibt eine viel einfachere Lösung dafür.

  1. Erstellen Sie eine untergeordnete Klasse, die die SqlMembershipProvider-Klasse erweitert.
  2. Aufschalten Methode
  3. Set Connectionstring-Eigenschaft config [ "Connection"]
  4. Lassen Sie die base.Initialize Logik
  5. In der Datei web.config, statt SqlMembershipProvider weiterhin initialisieren, Ihre benutzerdefinierte Klasse verwenden. (Wenn Sie einen anderen Namen angeben, müssen Sie das defaultProvider-Attribut entsprechend anpassen.)