MembershipProvider在代码中更改连接字符串

时间:2013-06-03 19:04:34

标签: asp.net asp.net-membership connection-string

我正在尝试在我的网站中实施Asp.net Forms身份验证。通常,您在web.config中提供数据库连接字符串的名称。但是,由于我们的数据库设置稍微复杂一些,我一直在寻找一种方法来手动为MembershipProvider提供代码中的连接字符串。

谢谢!

2 个答案:

答案 0 :(得分:12)

您不必为connectionStringName使用SqlMembershipProvider,而是可以直接提供连接字符串。即而不是:

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

您可以直接将连接字符串指定为:

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

因此,您还可以从SqlMembershipProvider派生自定义提供程序,并按如下方式动态构建连接字符串:

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

答案 1 :(得分:7)

我遇到这个需要做同样的事情,通过代码而不是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>

提供者类

    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()时,.NET类需要在web.config中指定了一个名称,这就是为什么你要放东西,所以我只使用了一个占位符,因为我知道我会在代码中覆盖它。

我们的团队这样做是因为我们需要根据不同的环境动态构建连接字符串,并且不想担心多个web.config浮动。