2009-06-22 31 views
6

Chúng tôi đang sử dụng nhà cung cấp thành viên ASP.Net (nhà cung cấp máy chủ SQL) và tôi muốn có thể thiết lập tài khoản người dùng quản trị như một phần của trình cài đặt của chúng tôi. Để làm điều này, tôi cần nhà cung cấp thành viên ASP.Net được cấu hình để trình cài đặt của tôi có thể sử dụng nó - nhưng tôi không muốn phải thiết lập một tệp cấu hình cho trình cài đặt.Làm thế nào tôi có thể cấu hình các nhà cung cấp thành viên ASP.Net thông qua mã?

Vì vậy, có cách nào để định cấu hình thành viên ASP.Net thông qua mã mà không cần viết nhà cung cấp tùy chỉnh không?

Trả lời

7

Ok, sau khi giải pháp họ gợi lên ở đây: http://forums.asp.net/p/997608/2209437.aspx

Tôi tạo ra một lớp học trong đó, các nhà xây dựng parameterless (mà bạn cần) chỉ nhận được máy chủ và cổng từ các đối số dòng lệnh. Như vậy mà tôi có thể đi "MembershipInitializer.exe "SomeSqlServer \ Instance" 51000.

public class CustomSQLMembershipProvider : SqlMembershipProvider { 
    private readonly string _server; 
    private readonly string _port; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="T:System.Web.Security.SqlMembershipProvider"/> class. 
    /// </summary> 
    public CustomSQLMembershipProvider() { 
    string[] args = System.Environment.GetCommandLineArgs(); 
    // args[0] is the exe name 
    _server = args[1]; 
    _port = args[2]; 
    } 

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
    base.Initialize(name, config); 

    // Update the private connection string field in the base class. 
    string connectionString = string.Format(@"Data Source={0},{1};Initial Catalog=aspnetdb;UID=NICCAMembership;PWD=_Password1;Application Name=NICCA;Connect Timeout=120;", _server, _port); 

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

Trong app.config của ứng dụng giao diện điều khiển của bạn (hoặc cửa sổ ứng dụng)

<configuration> 
<connectionStrings> 
    <clear/> 
    <add name="MembershipDB" 
    connectionString="Some Bogus String here that gets overrided in the custom class" 
    providerName="System.Data.SqlClient"/> 
</connectionStrings> 
<system.web> 
    <authentication mode="Forms"/> 
    <authorization> 
    <deny users="?"/> 
    </authorization> 
    <membership> 
    <providers> 
    <remove name="AspNetSqlMembershipProvider"/> 
    <add name="AspNetSqlMembershipProvider" 
     connectionStringName="MembershipDB" 
     applicationName="NICCA" 
     type="MyInitializeMembershipDB.CustomSQLMembershipProvider, MyInitializeMembershipDB" 
     requiresUniqueEmail="false" 
     requiresQuestionAndAnswer="false"/> 
    </providers> 
    </membership> 
</system.web> 
</configuration> 

Nếu bạn đang cần các nhà cung cấp vai trò bit là tốt, bạn có thể phải ghi đè lên SqlRoleProvider theo cách tương tự.

Nếu bạn đang tạo một chương trình tự động khởi tạo cơ sở dữ liệu thành viên của bạn đến một nhà nước cụ thể nhưng địa chỉ máy chủ sql và tên cổng aren ' t được biết cho đến khi ai đó nhập chúng vào stall wizard, thao tác này sẽ thực hiện thủ thuật ..

Điều này có hữu ích không?

+0

Đó là khá nhiều những gì tôi đã đến cuối cùng. Đó là một sự xấu hổ mà chúng tôi buộc phải sử dụng sự phản ánh để thiết lập các thành viên tư nhân để có được điều này để làm việc :-( –

+0

Trên thực tế có một cách đơn giản hơn để thiết lập trường này: juste write config ["connectionString"] = yourConnectionString; base.Initialize (tên, cấu hình); gọi và bạn đã hoàn tất!;) – jpatte

-1

Membership.ApplicationName = "yourfbaApplicationame"; MembershipUser user = Membership.CreateUser("admin,"password","[email protected]");

và đảm bảo rằng bạn có các mục sau trong tệp cấu hình.

<connectionStrings> 
<add connectionString="server=sqd01-1-cll;database=FBA;Integrated Security=SSPI;" name="FBASqlConnString" providerName="System.Data.SqlClient"/> 

Nếu bạn vẫn muốn sử dụng mã đầy đủ và không cần phải sử dụng các tập tin cấu hình. Sử dụng bên dưới

SqlMembershipProvider ObjSqlMembershipProvider = new SqlMembershipProvider(); 
      SqlRoleProvider ObjSqlRoleProvider = new SqlRoleProvider(); 
      NameValueCollection ObjNameValueCollRole = new NameValueCollection(); 
      NameValueCollection ObjNameValueCollMembership = new NameValueCollection(); 
      MembershipCreateStatus enMembershipCreateStatus; 

       ObjNameValueCollMembership.Add("connectionStringName", "Connection String Name"); 
       ObjNameValueCollMembership.Add("applicationName", "ApplicatioNAme"); 

       //these items are assumed to be Default and dont care..Should be given a look later stage. 
       ObjNameValueCollMembership.Add("enablePasswordRetrieval", "false"); 
       ObjNameValueCollMembership.Add("enablePasswordReset", "false"); 
       ObjNameValueCollMembership.Add("requiresQuestionAndAnswer", "false"); 
       ObjNameValueCollMembership.Add("requiresUniqueEmail", "false"); 
       ObjNameValueCollMembership.Add("passwordFormat", "Hashed"); 
       ObjNameValueCollMembership.Add("maxInvalidPasswordAttempts", "5"); 
       ObjNameValueCollMembership.Add("minRequiredPasswordLength", "1"); 
       ObjNameValueCollMembership.Add("minRequiredNonalphanumericCharacters", "0"); 
       ObjNameValueCollMembership.Add("passwordAttemptWindow", "10"); 
       ObjNameValueCollMembership.Add("passwordStrengthRegularExpression", ""); 

       //hard coded the Provider Name,This function just need one that is present. I tried other names and it throws error. I found this using Reflector ..all the rest are take care by the above 
       //name value pairs 
       ObjSqlMembershipProvider.Initialize("AspNetSqlMembershipProvider", ObjNameValueCollMembership);MembershipUser user = ObjSqlMembershipProvider.CreateUser("admin,"password","[email protected]");   

Một điều này Bạn cần cung cấp chuỗi kết nối trong tệp Cấu hình không có cách nào khác. Nếu bạn muốn điều đó quá là từ mã bạn cần phải kế thừa lớp

+0

Ông đang tìm cách xác định chuỗi kết nối thông qua mã .. – cbeuker

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