6

ユーザーの検証にメンバーシップを使用する .net Web アプリケーションを使用しています。メンバーシップは web.config ファイルに定義があり、ファイル (web.config) の接続文字列を参照します。web.config で静的にならないように、コードからメンバーシップの接続文字列を動的に設定する必要があります。

どうやってやるの?

前もって感謝します。

4

2 に答える 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;

編集:

このメソッドは、要求のライフサイクルの早い段階でメンバーシップ プロバイダーに接続文字列を設定します。

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機能します。

于 2012-10-11T12:20:44.580 に答える
2

これにはもっと簡単な解決策があります。

  1. SqlMembershipProvider クラスを拡張する子クラスを作成します。
  2. Initialize メソッドをオーバーライドする
  3. connectionString プロパティを設定します config["connectionString"]
  4. base.Initialize ロジックを続行させます
  5. web.config ファイルで、SqlMembershipProvider の代わりにカスタム クラスを使用します。(別の名前を付ける場合は、それに一致するように defaultProvider 属性を設定してください)
于 2013-08-03T20:27:37.497 に答える