更改成员连接字符串

时间:2013-03-07 07:32:36

标签: c# .net connection-string sqlmembershipprovider

我是asp.net会员资格的新手我需要帮助以编程方式更改其连接字符串。

我到目前为止所尝试的是

我创建了一个类项目名称Sample as namespace **并扩展了System.Web.Security.SqlMembershipProvider

代码为

namespace Sample
{
    public class Connectionstring : SqlMembershipProvider
    {
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            string connectionString = "server=xx.xx.xx;database=db;user id=un;password=pwd";    

           // Set private property of Membership provider.  
           FieldInfo connectionStringField = GetType().BaseType
                     .GetField("_sqlConnectionString", BindingFlags.Instance |
                                                       BindingFlags.NonPublic);
           connectionStringField.SetValue(this, connectionString);
        }
    }
}

并将会员标记中的Web配置文件更改为

<membership defaultProvider="SQLMembershipProvider">
  <providers>
    <add name="SQLMembershipProvider" type="sample.Connectionstring,sample" connectionStringName="SQLMembershipConnString" applicationName="@@@@@@@" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" />
  </providers>
</membership>

并且在运行Web应用程序项目时,我正在更改的连接字符串不会被更改?

等待您的宝贵回复和评论

3 个答案:

答案 0 :(得分:2)

我在网上发现的关于问题的是here

一个更简单,虽然有点眉毛的解决方案只是修改 请求中的提供者中的连接字符串足够早 生命周期:

     private void SetProviderConnectionString(string connectionString)
     {
         var connectionStringField = 
         Membership.Provider.GetType().GetField("_sqlConnectionString", 
                     BindingFlags.Instance | BindingFlags.NonPublic);

         if (connectionStringField != null)
             connectionStringField.SetValue(Membership.Provider, connectionString);
     }

从Global.asax.cs里面调用这个方法 Application_PreRequestHandlerExecute完成这项工作。 Haven没有测试过它 太多,但即使某些东西不起作用,它只是意味着它需要 要早点完成。不保证这适用于未来的版本 该框架尽管很可能会发生。

所以,&#39; SetProviderConnectionString&#39;方法可以手动调用(在Initialize方法完成后),而不是期望框架在第一次引用Membership.Provider时调用覆盖的Initialize方法。

答案 1 :(得分:1)

您为什么不在Web配置中使用连接字符串?

通常,Web服务器将使用Web服务器的凭据访问数据库,而不是单个用户的凭据。

这是asp.net身份验证的通用设置指南。 http://vstudiojourney.blogspot.com/2008/06/choosing-another-database-for.html

答案 2 :(得分:1)

您似乎没有从ReadFileWithEvent( HANDLE file, VOID * pData, size_t data, HANDLE exitEvent, BOOL & signalled ); 覆盖中调用base.Initialize。在这种情况下,我感到惊讶。

在.NET 4中(不确定早期版本),您应该能够在调用Initialize之前将连接字符串添加到配置集合中,如下所示:

base.Initialize

这样就可以避免使用反射来访问私有字段。