2013-06-03 6 views
6

私のサイトでAsp.netフォーム認証を実装しようとしています。通常、web.configにDB接続文字列の名前を指定します。しかし、データベースの設定が少し複雑なので、私は手動でMembershipProviderにコード内の接続文字列を提供する方法を探していました。MembershipProviderコード内の接続文字列を変更します

ありがとうございます!

+2

ジョーの答えは.NET 4.0では有効ですが、.NET 2.0-3.5では動作しませんが、Fleaの答えはどちらの場合でも有効です。 – nateirvin

答えて

11

SqlMembershipProviderconnectionStringNameを使用する必要はなく、接続文字列を直接入力することができます。私。代わりに:あなたはまた、SqlMembershipProviderからカスタムプロバイダを導出し、動的に接続文字列を構築できるため

<membership defaultProvider="SqlProvider" ...> 
    <providers> 
    <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
     connectionString="data source=... " 
     .../> 
    </providers> 
</membership> 

次のように:

<membership defaultProvider="SqlProvider" ...> 
    <providers> 
    <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" 
     connectionStringName="MyConnectionStringName" 
     .../> 
    </providers> 
</membership> 

あなたはとして直接、接続文字列を指定することができます

public class MySqlMembershipProvider : SqlMembershipProvider 
{ 
    public override void Initialize(string name, NameValueCollection config) 
    { 
     config["connectionString"] = BuildMyCustomConnectionString(); 
     base.Initialize(name, config); 
    } 
} 
+0

助けてくれてありがとうJoe! – TheCatWhisperer

6

私は同じことをする必要があり、コードよりもweb.configではなく、接続文字列を設定しましたが、名前よりも変更する必要がありました動的に生成される実際の値を編集します。

... 
    <connectionStrings> 
    <add name="ConnectionPlaceHolder" connectionString="This is a place holder"/> 
    </connectionStrings> 
... 
    <roleManager defaultProvider="SqlRoleProvider" enabled="true"> 
     <providers> 
     <clear/> 
     <add name="SqlRoleProvider" type="MyClassLibraries.Web.Security.MyCustomSqlRoleProvider" connectionStringName="ConnectionPlaceHolder" applicationName="MyApplicationName"/> 
     </providers> 
    </roleManager> 

プロバイダクラス

public class MySqlRoleProvider : SqlRoleProvider 
    { 
     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      try 
      { 
       config["connectionStringName"] = "ConnectionPlaceHolder"; 
       base.Initialize(name, config); 

       FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
       connectionStringField.SetValue(this, ApplicationConfiguration.RetrieveApplicationConfigurationValue(myConnectionString)); 
      } 
      catch (Exception ex) 
      { 
       CurrentOperation.RaiseException(ex); 
       throw ex; 
      } 
     } 

     private string myConnectionString() 
     { 
      return "Server=MyServer;database=MyDB;uid=aspnetDBUser;pwd=myPassword" 
     } 
    } 

あなたがbase.Initializeを呼び出す

web.configファイル:あなたは、実際の接続文字列を変更したい場合は、次の操作を行うことができ、コードから生成されます).NETクラスにはが必要です。なぜなら、何かを置く必要があるweb.configに名前が指定されているため、コード内でオーバーライドすることがわかっていたので、プレースホルダを使用しました。

私たちのチームは、異なる環境に基づいて接続文字列を動的に構築する必要があり、複数のweb.configを浮かべることを心配したくないので、これを行いました。

+0

.net 4.0から、 'config." connectionString "] ="接続文字列 ";を' base.initialize() 'の前に設定することで、リフレクションを必要とせずに簡単に行うことができます。ここに示すように(http://stackoverflow.com/a/33267235/122195) – thepirat000

関連する問題