2013-06-03 32 views
6

Tôi đang cố gắng triển khai Xác thực Mẫu Asp.net trong trang web của mình. Thông thường, bạn cung cấp tên của chuỗi kết nối DB trong web.config của mình. Tuy nhiên, khi thiết lập cơ sở dữ liệu của chúng tôi phức tạp hơn một chút, tôi đã tìm cách để cung cấp một cách thủ công MemberhipProvider chuỗi kết nối trong mã.MembershipProvider thay đổi chuỗi kết nối trong mã

Cảm ơn!

+2

Cần lưu ý rằng câu trả lời của Joe sẽ hoạt động cho .NET 4.0, nhưng không phải .NET 2.0-3.5, trong khi câu trả lời của Flea cũng sẽ hoạt động. – nateirvin

Trả lời

11

Bạn không phải sử dụng connectionStringName cho SqlMembershipProvider, thay vào đó bạn có thể cung cấp chuỗi kết nối trực tiếp. I E. thay vì:

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

Bạn có thể chỉ định chuỗi kết nối trực tiếp như:

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

Vì vậy, bạn cũng có thể lấy được một nhà cung cấp tùy chỉnh từ SqlMembershipProvider, và xây dựng các chuỗi kết nối tự động như sau:

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

Cảm ơn sự giúp đỡ của bạn Joe! – TheCatWhisperer

6

Tôi bắt gặp điều này cần phải làm điều tương tự, thiết lập chuỗi kết nối thông qua mã và không phải trong web.config, mặc dù tôi cần thay đổi nhiều hơn tên, tôi ne đã chỉnh sửa giá trị thực tế được tạo động. Nếu bạn muốn thay đổi chuỗi kết nối thực tế được tạo ra từ mã bạn có thể làm như sau:

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> 

Provider Lớp

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

Khi bạn gọi base.Initialize () Lớp .NET yêu cầu có tên được chỉ định trong web.config, đó là lý do tại sao bạn phải đặt thứ gì đó, vì vậy tôi chỉ sử dụng trình giữ chỗ vì tôi biết tôi sẽ ghi đè nó trong mã.

Nhóm của chúng tôi đã làm điều này vì chúng tôi cần xây dựng động các chuỗi kết nối dựa trên các môi trường khác nhau và không muốn phải lo lắng về việc có nhiều web.configs nổi xung quanh.

+0

Từ .net 4.0, bạn có thể làm điều đó một cách dễ dàng mà không cần phản ánh, bằng cách thiết lập 'config [" connectionString "] =" chuỗi kết nối ";' trước 'base.initialize()'. Như được hiển thị [ở đây] (http://stackoverflow.com/a/33267235/122195) – thepirat000

Các vấn đề liên quan