Изменение строки подключения к членству

Я новичок в членстве 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);
        }
    }
}

и изменил файл веб-конфигурации в теге членства как

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

и во время выполнения проекта веб-приложения изменяемая строка подключения не изменяется?

жду ваших ценных ответов и комментариев

3 ответа

То, что я также нашел в сети о проблеме, это здесь:

Более простое, хотя и несколько вызывающее удивление решение - просто изменить строку подключения в поставщиках достаточно рано на протяжении жизненного цикла запроса:

     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 делает эту работу. Не проверял это слишком много, но даже если что-то не работает, это просто означает, что это нужно сделать раньше. Нет гарантий, что это будет работать с будущими версиями фреймворка, хотя, скорее всего, так и будет.

Таким образом, метод 'SetProviderConnectionString' может быть вызван вручную (после завершения метода Initialize), вместо того, чтобы ожидать, что платформа вызовет перезаписанный метод Initialize при первом обращении к Membership.Provider.

Вы, кажется, не звоните base.Initialize от твоего Initialize переопределения. Я удивлен, что что-то работает в этом случае.

В.NET 4 (не уверен в более ранних версиях), вы должны иметь возможность добавить строку подключения в коллекцию конфигурации перед вызовом base.Initialize следующее:

public override void Initialize(string name, NameValueCollection config)
{
    config["connectionString"] = ... whatever ...;
    base.Initialize(name, config);
}

Это избавляет от необходимости использовать отражение для доступа к частному полю.

По какой причине вы не используете строку подключения в веб-конфигурации?

Обычно веб-сервер получает доступ к базе данных, используя учетные данные веб-сервера, а не учетные данные отдельного пользователя.

Это общее руководство по установке для аутентификации asp.net. http://vstudiojourney.blogspot.com/2008/06/choosing-another-database-for.html

Другие вопросы по тегам