2012-10-11 32 views
5

我有一個使用成員資格進行用戶驗證的.net Web應用程序。成員資格在web.config文件中有一個定義,並引用文件中的連接字符串(web.config),我需要從代碼中動態設置成員資格的連接字符串,而不是在web.config中保持靜態。從代碼中動態設置成員資格的連接字符串

我該怎麼做?

在此先感謝。

回答

5

以下C#示例代碼演示瞭如何通過Jacques L. Chereauconfigure 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可以完成這項工作。

+0

但是如何設置連接字符串?我需要從web.config中的代碼中引用連接字符串,我的意思是我需要成員從代碼中讀取連接字符串,而不是從web.config文件中讀取。所以從你的代碼我找不到連接字符串如何支持成員資格?我不需要在web.config中編寫連接字符串 – Ahmy

+0

我編輯了我的答案,其中包含方法 – chridam

+1

非常感謝,它工作正常,因爲我希望再次感謝。 – Ahmy

2

有一個更簡單的解決方案。

  1. 創建一個擴展SqlMembershipProvider類的子類。
  2. 覆蓋初始化方法
  3. 設置ConnectionString屬性配置[ 「的connectionString」]
  4. 讓base.Initialize邏輯繼續
  5. 在web.config文件中,而不是SqlMembershipProvider的,用你的 自定義類。 (如果你給它一個不同的名字,請確保將defaultProvider屬性設置爲匹配)
相關問題