私のサイトでAsp.netフォーム認証を実装しようとしています。通常、web.configにDB接続文字列の名前を指定します。しかし、データベースの設定が少し複雑なので、私は手動でMembershipProviderにコード内の接続文字列を提供する方法を探していました。MembershipProviderコード内の接続文字列を変更します
ありがとうございます!
私のサイトでAsp.netフォーム認証を実装しようとしています。通常、web.configにDB接続文字列の名前を指定します。しかし、データベースの設定が少し複雑なので、私は手動でMembershipProviderにコード内の接続文字列を提供する方法を探していました。MembershipProviderコード内の接続文字列を変更します
ありがとうございます!
SqlMembershipProvider
にconnectionStringName
を使用する必要はなく、接続文字列を直接入力することができます。私。代わりに:あなたはまた、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);
}
}
助けてくれてありがとうJoe! – TheCatWhisperer
私は同じことをする必要があり、コードよりも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を浮かべることを心配したくないので、これを行いました。
.net 4.0から、 'config." connectionString "] ="接続文字列 ";を' base.initialize() 'の前に設定することで、リフレクションを必要とせずに簡単に行うことができます。ここに示すように(http://stackoverflow.com/a/33267235/122195) – thepirat000
ジョーの答えは.NET 4.0では有効ですが、.NET 2.0-3.5では動作しませんが、Fleaの答えはどちらの場合でも有効です。 – nateirvin