我有一個使用成員資格進行用戶驗證的.net Web應用程序。成員資格在web.config文件中有一個定義,並引用文件中的連接字符串(web.config),我需要從代碼中動態設置成員資格的連接字符串,而不是在web.config中保持靜態。從代碼中動態設置成員資格的連接字符串
我該怎麼做?
在此先感謝。
我有一個使用成員資格進行用戶驗證的.net Web應用程序。成員資格在web.config文件中有一個定義,並引用文件中的連接字符串(web.config),我需要從代碼中動態設置成員資格的連接字符串,而不是在web.config中保持靜態。從代碼中動態設置成員資格的連接字符串
我該怎麼做?
在此先感謝。
以下C#示例代碼演示瞭如何通過Jacques L. Chereau來configure a .NET membership provider programmatically。此代碼需要您也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])(?=.*[[email protected]#$%^&*()_+}{\\":;'?/>.<,])(?!.*\\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);
}
未經測試,但在Global.asax.cs中調用此方法的Application_PreRequestHandlerExecute
可以完成這項工作。
有一個更簡單的解決方案。
但是如何設置連接字符串?我需要從web.config中的代碼中引用連接字符串,我的意思是我需要成員從代碼中讀取連接字符串,而不是從web.config文件中讀取。所以從你的代碼我找不到連接字符串如何支持成員資格?我不需要在web.config中編寫連接字符串 – Ahmy
我編輯了我的答案,其中包含方法 – chridam
非常感謝,它工作正常,因爲我希望再次感謝。 – Ahmy