从代码中动态设置成员身份连接字符串

6
我有一个使用会员资格进行用户验证的.NET网络应用程序。会员资格在web.config文件中定义,并引用该文件(web.config)中的连接字符串,我需要动态地从代码中设置会员资格的连接字符串,而不是在web.config中静态设置。

我该如何做呢?

提前感谢您的回答。

2个回答

5
以下C#示例代码演示如何通过Jacques L. Chereau来编程配置.NET成员提供程序。该代码要求您还配置名为MyDatabase的连接字符串
NameValueCollection objConfig = new NameValueCollection();
objConfig.Add("connectionStringName", "MyDatabase");
objConfig.Add("enablePasswordRetrieval", "false");
objConfig.Add("enablePasswordReset", "true");
objConfig.Add("requiresQuestionAndAnswer", "true");
objConfig.Add("applicationName", "MyApp");
objConfig.Add("requiresUniqueEmail", "true");
objConfig.Add("maxInvalidPasswordAttempts", "5");
objConfig.Add("passwordAttemptWindow", "10");
objConfig.Add("commandTimeout", "30");
objConfig.Add("passwordFormat", "Hashed");
objConfig.Add("name", "AspNetSqlMembershipProvider");
objConfig.Add("minRequiredPasswordLength", "8");
objConfig.Add("minRequiredNonalphanumericCharacters", "2");
objConfig.Add("passwordStrengthRegularExpression", "(?=^.{8,25}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{\\":;'?/>.<,])(?!.*\\s).*$"));

SqlMembershipProvider objSqlMembershipProvider = new SqlMembershipProvider();
objSqlMembershipProvider.Initialize(objConfig["name"], objConfig);
MembershipProviderCollection colMembershipProviders = new MembershipProviderCollection();
colMembershipProviders.Add(objSqlMembershipProvider);
colMembershipProviders.SetReadOnly();

BindingFlags enuBindingFlags = BindingFlags.NonPublic | BindingFlags.Static;
Type objMembershipType = typeof(Membership);
objMembershipType.GetField("s_Initialized", enuBindingFlags).SetValue(null, true);
objMembershipType.GetField("s_InitializeException", enuBindingFlags).SetValue(null, null);
objMembershipType.GetField("s_HashAlgorithmType", enuBindingFlags).SetValue(null, "SHA1");
objMembershipType.GetField("s_HashAlgorithmFromConfig", enuBindingFlags).SetValue(null, false);
objMembershipType.GetField("s_UserIsOnlineTimeWindow", enuBindingFlags).SetValue(null, 15);
objMembershipType.GetField("s_Provider", enuBindingFlags).SetValue(null, objSqlMembershipProvider);
objMembershipType.GetField("s_Providers", enuBindingFlags).SetValue(null, colMembershipProviders);

假设您有以下库引用:
using System.Web.Security;
using System.Collections.Specialized;
using System.Reflection;

编辑:

该方法在请求的生命周期早期设置了Membership提供程序中的连接字符串。

private void SetMembershipProviderConnectionString(string connectionString)
{
   // Set private property of Membership. Untested code!!
   var connectionStringField = Membership.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
   if (connectionStringField != null)
      connectionStringField.SetValue(Membership.Provider, connectionString);

}

虽未经测试,但在Application_PreRequestHandlerExecute中从Global.asax.cs调用此方法即可完成任务。


但是如何设置连接字符串呢?我需要从代码中引用连接字符串,而不是从web.config文件中引用。我的意思是,我需要让成员资格从代码中读取连接字符串,而不是从web.config文件中读取。因此,从您的代码中,我无法找到连接字符串是如何支持成员资格的?我不需要在web.config中编写连接字符串。 - Ahmy
1
非常感谢,它按照我期望的方式正常工作了,再次感谢。 - Ahmy

2

这个问题有一个更简单的解决方案。

  1. 创建一个继承SqlMembershipProvider类的子类。
  2. 重写Initialize方法。
  3. 设置connectionString属性为config["connectionString"]。
  4. 让基本的Initialize逻辑继续。
  5. 在web.config文件中,使用你自己的自定义类替代SqlMembershipProvider。(如果你给它起了不同的名字,请确保将defaultProvider属性设置为匹配的名称)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接