Поставщик членства в ASP.Net

Есть ли способ отключить поставщика членства ASP.Net от использования web.config?

В настоящее время он хранит строку подключения и sqlMembershipProvider в файле web.config, который находится не там, где мне хотелось бы.

Спасибо


person Community    schedule 20.07.2010    source источник


Ответы (2)


Обычно вы можете использовать поставщика сразу после вызова его конструктора по умолчанию и вызвать для него Initialize. Однако невозможно использовать абстракцию System.Web.Security.Membership без web.config, потому что класс Membership жестко привязан к файлу конфигурации. При использовании класса Membership он будет создавать экземпляры типов, которые вы настроили в файле конфигурации.

Как я уже сказал, если вы не хотите настраивать его в файле конфигурации, вы можете создать его в коде. Это был бы хороший подход, особенно когда у вас есть собственная структура IoC (вы можете рассматривать фасад Membership как реализацию IoC только для типов, производных от MembershipProvider). Вот пример того, как создать SqlMembershipProvider:

var configuration = new NameValueCollection();

configuration.Add("name", "SqlProvider");
configuration.Add("connectionStringName", "SqlServices");
configuration.Add("applicationName", "MyApplication");
configuration.Add("enablePasswordRetrieval", "false");
configuration.Add("enablePasswordReset", "true");
configuration.Add("requiresQuestionAndAnswer", "true");
configuration.Add("requiresUniqueEmail", "false");
configuration.Add("passwordFormat", "Hashed");
configuration.Add("maxInvalidPasswordAttempts", "5");
configuration.Add("passwordAttemptWindow", "10");

var provider = new SqlMembershipProvider();
provider.Initialize("SqlProvider", configuration);

// And here store it in a static field or register it with your
// favorite IoC container.
container.RegisterSingle<MembershipProvider>(provider);

Удачи.

person Steven    schedule 20.07.2010
comment
Это приведет к удалению поставщиков, но мне нужен поставщик членства для подключения к базе данных, но без чтения чего-либо из web.config. Это возможно? - person ; 20.07.2010
comment
++ Стивен, я полностью выделил это очевидное решение. Я использую ту же настройку для тестирования провайдеров. В любом случае, чтобы ответить @vikp, просто поместите фиктивную строку подключения в файл конфигурации и после инициализации используйте отражение, чтобы установить строку подключения (она не является общедоступной, используйте отражатель, чтобы найти ее) из вашего реестра сразу после .Initialize. - person Sky Sanders; 22.07.2010
comment
Есть ли способ обойти строку подключения, я использую только SqlMemberShipProvider для его метода шифрования (для устаревших целей мне нужно), но я не хочу, чтобы мое приложение зависело от app.config. - person Didier A.; 26.08.2013
comment
@ Стивен Где бы я отдал это? В моем приложении нет ни app.config, ни web.config, я хочу, чтобы он был автономным одиночным .exe. Есть ли способ указать строку подключения в коде? - person Didier A.; 26.08.2013
comment
@didibus: Мне жаль, что ты не можешь. Вы передаете имя, и провайдер всегда будет запрашивать конфигурацию о существовании строки подключения с этим именем. - person Steven; 26.08.2013
comment
Разве нельзя просто вызвать метод encrypt после создания экземпляра провайдера? Какой именно метод? - person Steven; 26.08.2013
comment
@Steven Нет, потому что методу EncryptPassword нужен machineKey, и я не знаю, как настроить его в коде без вызова Initialize. Если у вас нет идеи? - person Didier A.; 27.08.2013
comment
@didibus: Я бы сказал, что вы не можете использовать SqlMembershipProvider без файла конфигурации xml. Совет: декомпилируйте SqlMembershipProvider исходный код в Reflector или связанном с ним инструменте и скопируйте этот код в свой собственный проект. - person Steven; 27.08.2013

Сантехника поставщика управляется конфигурацией.

В зависимости от вашего уровня опыта вы можете использовать своих собственных провайдеров, которые инициализируются другими способами, но это определенно нетривиальная задача и чревата тонкими ловушками, которые обнаруживаются в самые неподходящие моменты, например, когда ваш босс входит в систему. и его сетевой пароль просочился.

Попытка программно инициализировать внутренних провайдеров будет разочарованием.

Это могло бы помочь, если бы вы объяснили, почему вам не нравится использовать файл конфигурации для, ммм, конфигурации?

person Sky Sanders    schedule 20.07.2010
comment
Все остальные строки подключения хранятся в центральном месте, и я не хочу, чтобы они лежали вокруг web.config. Разочаровывает, что провайдер членства asp.net просто добавляет их за вас, а через несколько дней вы натыкаетесь на строку подключения в файле web.config. ... - person ; 20.07.2010
comment
@vikp - хорошо, не поймите меня неправильно, я не пытаюсь ссориться с вами, но я должен спросить, где ваше предпочтительное место для строки подключения, и это может помочь мне лучше понять, как помочь вам добраться туда, где вы хочу пойти. - person Sky Sanders; 20.07.2010
comment
У меня совсем не сложилось такого впечатления, так что не беспокойтесь :) Остальные строки подключения хранятся в реестре, поскольку платформой для приложения всегда будет Windows. Web.config доступен в веб-приложении, когда app.config доступен в не веб-приложениях, это означает, что мне придется поддерживать строки подключения в двух местах, а не в одном. - person ; 20.07.2010
comment
@vikp - см. комментарий к ответу Стивена. Я думаю, у вас есть победитель. Понятия не имею, почему я отказался от решения. Я использую то же самое для тестирования поставщиков, но, видимо, привыкаю давать ответы «лучшие / лучшие практики», что я оказал вам медвежью услугу. Я теряю связь со своим «делай дело». ваше здоровье. - person Sky Sanders; 22.07.2010
comment
Не могли бы вы оба файла конфигурации импортировать строку подключения из общего включаемого файла? Подробнее см. devx.com/vb2themax/Tip/18880 - person Owen Blacker; 13.10.2010
comment
@owen - конечно, но история в том, что OP не хочет .config. - person Sky Sanders; 13.10.2010
comment
@Sky: Да, хотя, читая почему, это может решить ту же проблему за него. - person Owen Blacker; 14.10.2010