c# - 从代码动态设置成员资格的连接字符串

标签 c# connection-string membership

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

我该怎么做?

提前致谢。

最佳答案

以下 C# 示例代码演示了如何 configure a .NET membership provider programmatically通过 Jacques L. Chereau .此代码还要求您 configure a connection string名为 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;

编辑:

此方法在请求的生命周期中足够早地在成员资格提供程序中设置连接字符串

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 调用此方法可以完成工作。

关于c# - 从代码动态设置成员资格的连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838669/

相关文章:

c# - 结构作为 C# 中值类型的包装器

c# - 在 Entity Framework 中保存编辑的对象

visual-studio - 如何创建解决方案范围的连接字符串

mysql - 指定的字符串不符合电子邮件地址所需的格式。有什么解决办法吗?

ASP.NET 标识

asp.net - 在新的MVC4应用程序中获取UserId(int)

c# - 如何在 C#/Visual Studio 中调用包含在文件夹中的类?

c# - 二维网格的 .NET 集合?

azure - 将 Azure Key Vault key 分配给 DevOps 发布管道的连接字符串

c# - 在 eecute reader 上收到错误,提示我的 sql 语法不正确