2013-06-03 16 views
6

Sto cercando di implementare l'autenticazione di Forms Asp.net nel mio sito. Di solito, si fornisce il nome della stringa di connessione DB nel proprio web.config. Tuttavia, poiché la configurazione del nostro database è un po 'più complicata, stavo cercando un modo per fornire manualmente a MembershipProvider la stringa di connessione nel codice.MembershipProvider modifica stringa di connessione nel codice

Grazie!

+2

Va notato che la risposta di Joe funzionerà con .NET 4.0, ma non con .NET 2.0-3.5, mentre la risposta di Flea funzionerà per entrambi. – nateirvin

risposta

11

Non è necessario utilizzare connectionStringName per SqlMembershipProvider, ma è possibile fornire direttamente la stringa di connessione. Cioè invece di:

<membership defaultProvider="SqlProvider" ...> 
    <providers> 
    <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
     connectionStringName="MyConnectionStringName" 
     .../> 
    </providers> 
</membership> 

È possibile specificare la stringa di connessione direttamente come:

<membership defaultProvider="SqlProvider" ...> 
    <providers> 
    <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
     connectionString="data source=... " 
     .../> 
    </providers> 
</membership> 

Pertanto si potrebbe anche derivare un provider personalizzato da SqlMembershipProvider, e costruire la stringa di connessione in modo dinamico come segue:

public class MySqlMembershipProvider : SqlMembershipProvider 
{ 
    public override void Initialize(string name, NameValueCollection config) 
    { 
     config["connectionString"] = BuildMyCustomConnectionString(); 
     base.Initialize(name, config); 
    } 
} 
+0

Grazie per il vostro aiuto Joe! – TheCatWhisperer

6

Mi sono imbattuto in questo che ha bisogno di fare la stessa cosa, impostare la stringa di connessione tramite codice e non nel web.config, anche se ho bisogno di cambiare più del nome, io ne modificare il valore effettivo da generare dinamicamente. Se si desidera modificare la stringa di connessione effettiva deve essere generato dal codice è possibile effettuare le seguenti operazioni:

web.config

... 
    <connectionStrings> 
    <add name="ConnectionPlaceHolder" connectionString="This is a place holder"/> 
    </connectionStrings> 
... 
    <roleManager defaultProvider="SqlRoleProvider" enabled="true"> 
     <providers> 
     <clear/> 
     <add name="SqlRoleProvider" type="MyClassLibraries.Web.Security.MyCustomSqlRoleProvider" connectionStringName="ConnectionPlaceHolder" applicationName="MyApplicationName"/> 
     </providers> 
    </roleManager> 

Class Provider

public class MySqlRoleProvider : SqlRoleProvider 
    { 
     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      try 
      { 
       config["connectionStringName"] = "ConnectionPlaceHolder"; 
       base.Initialize(name, config); 

       FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
       connectionStringField.SetValue(this, ApplicationConfiguration.RetrieveApplicationConfigurationValue(myConnectionString)); 
      } 
      catch (Exception ex) 
      { 
       CurrentOperation.RaiseException(ex); 
       throw ex; 
      } 
     } 

     private string myConnectionString() 
     { 
      return "Server=MyServer;database=MyDB;uid=aspnetDBUser;pwd=myPassword" 
     } 
    } 

Quando si chiama base.Initialize () la classe .NET richiede ci sia un nome specificato nel web.config che è il motivo per cui devi mettere qualcosa, quindi ho appena usato un segnaposto poiché sapevo che lo avrei sovrascritto nel codice.

Il nostro team ha fatto questo perché avevamo bisogno di creare dinamicamente stringhe di connessione basate su ambienti diversi e non volevamo preoccuparci di avere più web.configs in giro.

+0

Da .net 4.0, puoi farlo facilmente senza bisogno di riflessioni, impostando questo 'config [" connectionString "] =" la stringa di connessione ";' prima di 'base.initialize()'. Come mostrato [qui] (http://stackoverflow.com/a/33267235/122195) – thepirat000

Problemi correlati