The*_*rer 7 asp.net connection-string asp.net-membership
我想在我的网站上实现Asp.net Forms身份验证.通常,您在web.config中提供数据库连接字符串的名称.但是,由于我们的数据库设置稍微复杂一点,我一直在寻找一种方法来手动为MembershipProvider提供代码中的连接字符串.
谢谢!
Joe*_*Joe 12
您不必使用connectionStringNamefor SqlMembershipProvider,而是可以直接提供连接字符串.即代替:
<membership defaultProvider="SqlProvider" ...>
<providers>
<add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MyConnectionStringName"
.../>
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
您可以直接指定连接字符串:
<membership defaultProvider="SqlProvider" ...>
<providers>
<add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider"
connectionString="data source=... "
.../>
</providers>
</membership>
Run Code Online (Sandbox Code Playgroud)
因此,您还可以从SqlMembershipProvider派生自定义提供程序,并按如下方式动态构建连接字符串:
public class MySqlMembershipProvider : SqlMembershipProvider
{
public override void Initialize(string name, NameValueCollection config)
{
config["connectionString"] = BuildMyCustomConnectionString();
base.Initialize(name, config);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到这个需要做同样的事情,通过代码而不是web.config设置连接字符串,虽然我需要更改更多名称,我需要动态生成实际值.如果要更改要从代码生成的实际连接字符串,可以执行以下操作:
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>
Run Code Online (Sandbox Code Playgroud)
提供者类
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"
}
}
Run Code Online (Sandbox Code Playgroud)
当你调用base.Initialize()时,.NET类要求在web.config中指定一个名称,这就是为什么你要放东西,所以我只使用了一个占位符,因为我知道我会在代码中覆盖它.
我们的团队之所以这样做是因为我们需要根据不同的环境动态构建连接字符串,并且不想担心多个web.config浮动.
| 归档时间: |
|
| 查看次数: |
8659 次 |
| 最近记录: |