Изменение строки подключения к членству
Я новичок в членстве 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