2013-06-03 25 views
6

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

谢谢!

+2

需要注意的是,Joe的答案适用于.NET 4.0,但不适用于.NET 2.0-3.5,而Flea的答案适用于其中之一。 – nateirvin

回答

11

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

<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); 
    } 
} 
+0

谢谢你的帮助乔! – TheCatWhisperer

6

我遇到了这个需要做同样的事情,通过代码设置连接字符串,而不是在web.config,虽然我需要改变更多的名称,我ne结束动态生成的实际值。如果你想改变实际的连接字符串从代码生成,你可以做到以下几点:

的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> 

Provider类

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.configs在四处漫游。

+0

从.net 4.0开始,通过在'base.initialize()'之前设置这个'config [“connectionString”] =“连接字符串”;'',您就可以轻松完成任务,而无需反射。如[这里]所示(http://stackoverflow.com/a/33267235/122195) – thepirat000