2013-03-07 14 views
7

Ich bin neu für asp.net Mitgliedschaft & Ich brauche Hilfe, um seine Verbindungszeichenfolge programmgesteuert zu ändern.Ändern der Mitgliedschaft Verbindungszeichenfolge

Was ich habe versucht, bis jetzt ist

ich erstellen eine Klasse Projektname Beispiel als Namensraum ** und erweitert die System.Web.Security.SqlMembershipProvider

Code als

namespace Sample 
{ 
    public class Connectionstring : SqlMembershipProvider 
    { 
     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      string connectionString = "server=xx.xx.xx;database=db;user id=un;password=pwd";  

      // Set private property of Membership provider. 
      FieldInfo connectionStringField = GetType().BaseType 
        .GetField("_sqlConnectionString", BindingFlags.Instance | 
                 BindingFlags.NonPublic); 
      connectionStringField.SetValue(this, connectionString); 
     } 
    } 
} 

und veränderte Web-Konfigurationsdatei in Mitgliedstag wie

<membership defaultProvider="SQLMembershipProvider"> 
    <providers> 
    <add name="SQLMembershipProvider" type="sample.Connectionstring,sample" connectionStringName="SQLMembershipConnString" applicationName="@@@@@@@" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" /> 
    </providers> 
</membership> 

und während r Wenn ich das Webanwendungsprojekt deaktiviere, wird die Verbindungszeichenfolge, die ich verändere, nicht verändert.

warten auf Ihre wertvollen Antworten und Kommentare

+1

Aus Neugier, warum müssen Sie das tun? – Alyce

+0

@Alyce meine Aufgabe ist es, Benutzer für diese Tabelle zu erstellen und den Befehl basierend auf dem Benutzer in der Datenbank eingeben – GowthamanSS

+1

Hallo, versuchen Sie diesen Link, es kann Ihnen helfen http://forums.asp.net/t/997608.aspx/1/10 – Niventh

Antwort

1

Aus welchem ​​Grund sind Sie nicht eine Verbindungszeichenfolge in der Web-config?

Normalerweise greift der Webserver mit den Anmeldeinformationen des Webservers auf die Datenbank zu, nicht auf die Anmeldeinformationen eines einzelnen Benutzers.

Dies ist ein allgemeiner Leitfaden für die asp.net-Authentifizierung. http://vstudiojourney.blogspot.com/2008/06/choosing-another-database-for.html

1

Was ich auch im Netz über Problem gefunden haben, ist dies here:

Eine einfachere, wenn auch etwas Augenbraue-raising-Lösung wird nur modifiziert die Verbindungszeichenfolge in den Anbietern früh genug in den Lebenszyklus Anfrage :

 private void SetProviderConnectionString(string connectionString) 
    { 
     var connectionStringField = 
     Membership.Provider.GetType().GetField("_sqlConnectionString", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

     if (connectionStringField != null) 
      connectionStringField.SetValue(Membership.Provider, connectionString); 
    } 

diese Methode von Global.asax.cs Aufruf innerhalb Application_PreRequestHandlerExecute macht die Arbeit. Habe es nicht zu viel getestet, aber selbst wenn etwas nicht funktioniert, bedeutet es nur, dass es früher getan werden muss. Keine Garantie, dass dies mit zukünftigen Versionen des Frameworks funktioniert, obwohl es wahrscheinlich ist.

So kann die Methode 'SetProviderConnectionString' manuell aufgerufen werden (nachdem die Initialize-Methode abgeschlossen ist), anstatt zu erwarten, dass das Framework die überschriebene Initialize-Methode aufruft, wenn der Membership.Provider zum ersten Mal referenziert wird.

1

Sie scheinen nicht base.Initialize von Ihrem Initialize Override aufrufen. Ich bin überrascht, dass in diesem Fall alles funktioniert.

In .NET 4 (nicht über frühere Versionen sicher ist), sollten Sie in der Lage sein, um die Verbindungszeichenfolge in der Konfigurations Sammlung hinzuzufügen, bevor base.Initialize Aufruf wie folgt:

public override void Initialize(string name, NameValueCollection config) 
{ 
    config["connectionString"] = ... whatever ...; 
    base.Initialize(name, config); 
} 

die Notwendigkeit, dies vermeiden Reflexion zu verwenden, um Zugriff auf ein privates Feld

+0

das funktioniert! Vielen Dank – thepirat000