2013-06-03 25 views
6

Sitemde Asp.net Form Kimlik Doğrulaması'nı uygulamaya çalışıyorum. Genellikle, DB bağlantı dizenizin adını web.config dosyanıza yazarsınız. Ancak, veritabanı kurulumumuz biraz daha karmaşık olduğundan, MembershipProvider'a bağlantı dizesini kodda elle sağlamanın bir yolunu arıyordum.MembershipProvider kodundaki bağlantı dizesini değiştirin

Teşekkürler!

+2

Joe'nun cevabının .NET 4.0 için çalışacağına, ancak .NET 2.0-3.5'e değil, Flea'nın yanıtının da çalışacağına dikkat edilmelidir. – nateirvin

cevap

11

SqlMembershipProvider için connectionStringName kullanmanız gerekmez, bunun yerine doğrudan bağlantı dizesini sağlayabilirsiniz. Yani yerine: Ayrıca SqlMembershipProvider gelen özel bir sağlayıcı türetmek ve dinamik bağlantı dizesi inşa edebileceğini nedenle

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

şöyle:

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

sen direkt bağlantı dizesini belirtebilirsiniz

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

Yardımlarınız için teşekkürler Joe! – TheCatWhisperer

6

Aynı şeyi yapmaya ihtiyacım vardı, bağlantı dizesini web.config dosyasında değil, kod yoluyla ayarlayın, ancak isimden daha fazla değiştirmem gerekiyordu. Dinamik olarak oluşturulacak gerçek değeri düzenledi.

... 
    <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> 

Sağlayıcı Sınıf

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" 
     } 
    } 

Eğer base.Initialize çağrı

(

web.config: Eğer gerçek bağlantı dizesini değiştirmek isterseniz aşağıdakileri yapabilirsiniz koddan oluşturulacak) .NET sınıfı , için web.config dosyasında belirtilen bir ad olmalıdır, bu nedenle bir şey koymak zorundasınız, bu yüzden kodda geçersiz sayılacağımı bildiğimden beri bir yer tutucu kullandım.

Ekibimiz bunu gerçekleştirdi çünkü farklı ortamlara bağlı olarak bağlantı dizelerini dinamik olarak oluşturmamız gerekiyordu ve etrafta yüzen birden fazla web.confuzu bulunması konusunda endişelenmek istemedik.

+0

.Net 4.0'dan, yansıma gerekmeden kolayca yapabilirsiniz, bu "config [" connectionString "] =" bağlantı dizgisi ";" base.initialize() 'den önce). Gösterildiği gibi [here] (http://stackoverflow.com/a/33267235/122195) – thepirat000

İlgili konular