C# 如何通过代码配置ASP.Net成员资格提供程序?

C# 如何通过代码配置ASP.Net成员资格提供程序?,c#,asp.net,asp.net-membership,windows-installer,C#,Asp.net,Asp.net Membership,Windows Installer,我们正在使用ASP.Net成员资格提供程序(SQL Server提供程序),我希望能够在安装程序中设置管理员用户帐户。为此,我需要配置ASP.Net成员资格提供程序,以便我的安装程序可以使用它-但我不想为安装程序设置配置文件 那么,有没有一种方法可以通过代码配置ASP.Net成员身份,而无需编写自定义提供程序?membership.ApplicationName=“yourfbaApplicationame”; MembershipUser=Membership.CreateUser(“管理员”

我们正在使用ASP.Net成员资格提供程序(SQL Server提供程序),我希望能够在安装程序中设置管理员用户帐户。为此,我需要配置ASP.Net成员资格提供程序,以便我的安装程序可以使用它-但我不想为安装程序设置配置文件


那么,有没有一种方法可以通过代码配置ASP.Net成员身份,而无需编写自定义提供程序?

membership.ApplicationName=“yourfbaApplicationame”;
MembershipUser=Membership.CreateUser(“管理员”,密码,”emaiol@g.com”;

并确保配置文件中有以下条目

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

其中之一是,您需要在配置文件中为连接字符串指定no other go。如果您希望该字符串也来自代码,则需要继承该类

确定,遵循他们在此处提出的解决方案:

我创建了一个类,在无参数构造函数(您需要)中,该类仅从命令行参数获取服务器和端口。这样我就可以转到“MembershipInitializer.exe”SomeSqlServer\Instance“51000

公共类CustomSQLMembershipProvider:SqlMembershipProvider{ 专用只读字符串\u服务器; 专用只读字符串\u端口; /// ///初始化类的新实例。 /// 公共CustomSQLMembershipProvider(){ 字符串[]args=System.Environment.GetCommandLineArgs(); //args[0]是exe名称 _服务器=args[1]; _端口=args[2]; } public override void Initialize(字符串名称,System.Collections.Specialized.NameValueCollection配置) { 初始化(名称、配置); //更新基类中的专用连接字符串字段。 string connectionString=string.Format(@“数据源={0},{1};初始目录=aspnetdb;UID=NICCAMembership;PWD=_密码1;应用程序名=NICCA;连接超时=120;”,_服务器,_端口); //设置成员资格提供程序的私有属性。 FieldInfo connectionStringField=GetType().BaseType.GetField(“_sqlConnectionString”,BindingFlags.Instance | BindingFlags.NonPublic); connectionStringField.SetValue(此,connectionString); } } 在控制台应用程序(或windows应用程序)的app.config中


如果您还需要角色提供程序位,则可能必须以大致相同的方式重写SqlRoleProvider

如果您正在创建一个程序,以自动将您的成员数据库初始化为基于特定状态的数据库,但直到有人将sql server地址和端口名输入安装向导后,才知道它们的名称,那么这样就可以了


这有帮助吗?

这就是我最后得出的结论。遗憾的是,我们被迫使用反射来设置私有成员以使其正常工作:-(.实际上有一种更简单的方法来设置此字段:只需在base.Initialize(name,config);call之前写入config[“connectionString”]=yourConnectionString;,就可以了!;)
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","emaiol@g.com");         
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);
  }
}
<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>