C# 如何通过代码配置ASP.Net成员资格提供程序?
我们正在使用ASP.Net成员资格提供程序(SQL Server提供程序),我希望能够在安装程序中设置管理员用户帐户。为此,我需要配置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成员身份,而无需编写自定义提供程序?
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>