2010-04-02 6 views
3

У меня есть приложение C# asp.net с использованием стандартного Sql MembershipProvider. Моя web.config имеет несколько параметров, которые определяют, как я использую этот провайдер:Могу ли я настроить ResetPassword в членском пакете Asp.Net?

enablePasswordRetrieval="false" 
enablePasswordReset="true" 
requiresUniqueEmail="true" 
passwordFormat="Hashed" 
minRequiredPasswordLength="5" 

Проблемы я бег в том, что когда люди сбросить свои пароли, кажется, метод ResetPassword() возвращает пароль который длиннее, чем я хочу, и имеет символы, которые могут сбивать с толку (l, 1, i, I, 0, O). Кроме того, я отправляю своим пользователям электронное письмо с текстовым сообщением и HTML-сообщением (я использую MailMessage с AlternateViews). Если у пароля в нем есть небезопасные символы HTML, когда почтовые клиенты отображают текст HTML, пароль может быть другим (например,%, & и < не совсем безопасны для HTML).

Я просмотрел элемент «добавить», который принадлежит к web.config, но я не вижу никаких дополнительных свойств конфигурации, чтобы включать только определенные символы в метод ResetPassword() и ограничивать длину пароля.

Могу ли я настроить метод ResetPassword() для ограничения длины пароля и ограничения набора символов, который он выбирает?

Сейчас у меня есть обходной путь: я называю ResetPassword(), чтобы убедиться, что входящий в комплект поставки ответ правильный, а затем я использую RandomPassword generator я скачал из Интернета, чтобы сгенерировать пароль, который мне нравится (без неоднозначных символов, HTML безопасно и всего 8 символов), а затем я вызываю ChangePassword(), чтобы изменить пароль пользователя после того, как я его уже сбросил.

Мое обходное решение кажется kludgy, и я подумал, что лучше настроить ResetPassword(), чтобы делать то, что я хочу.

спасибо ~!

ColoradoTechie

+0

У вас есть хороший опыт до сих пор с этим 'RandomPassword generator'? Я также ищу такую ​​вещь, так как я никогда не нашел способ настроить «ResetPassword». – Slauma

+0

Мне лично это нравится, однако мы еще не закончили наше приложение, поэтому я не уверен, как он работает. Прямо сейчас я называю это дважды (newPassword = RandomPassword.Generate (7) + RandomPassword.Generate (1);), потому что я хочу, чтобы мой новый пароль начинался и заканчивался символом (если вы читаете комментарии, код всегда будет генерировать пароль, начинающийся с символа). Мне также нравится, как я могу ограничить специальные символы. –

+0

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

ответ

2

Я не верю, что вы можете сделать что-либо "Configure" Зов ResetPassword(). Вы можете написать собственный провайдер, который изменит работу ResetPassword().

link Это описывает ту же тактику, вы, кажется, делать уже ....

Остаться с вашей работой вокруг/хак может быть самым простым способом пойти. :-)

Однако, если вы хотите узнать больше о том, как создать своего собственного провайдера, ознакомьтесь с этими ссылками.

http://www.asp.net/learn/videos/video-189.aspx

http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

http://www.devx.com/asp/Article/29256/0/page/3

http://www.15seconds.com/issue/050216.htm

2

Использование метода GeneratePassword обеспечивает, по меньшей мере, что созданный пароль выполняет настройку для MinRequiredPasswordLength и MinRequiredNonAlphanumericCharacters. Я делаю что-то вроде этого:

// aUser is of class MembershipUser 
string aTempPassword = aUser.ResetPassword(); 
string aNewPassword = Membership.GeneratePassword(
          Membership.MinRequiredPasswordLength, 
          Membership.MinRequiredNonAlphanumericCharacters); 
aUser.ChangePassword(aTempPassword, aNewPassword); 

Ну, это только 50% от того, что вы хотите, так как вы не можете контролировать набор символов, используемый для окончательного пароля.

(На самом деле это также с моей точки зрения более важный аспект - особенно если у вас есть пользователи, которым нужны 10 минут и 3 вызова поддержки, чтобы успешно нажать комбинацию скрученной скобки и не иметь понятия, что такое буфер обмена ResetPassword может сделать вас одним из самых ненавистных лиц.)

+0

Я в порядке с этим 50% трюком! Идем делать то же самое! Благодарю. – sangam

0

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

SQLMembershipProvider класс предоставляет

public virtual string GeneratePassword() 

, который вызывается ResetPassword. Поэтому вы можете просто расширить класс SQLMembershipProvider и реализовать свою собственную версию GeneratePassword.

Обратите внимание, что делать это потребует от вас обновить запись поставщика членства в вашем web.config для использования нового класса поставщика членства:

<membership> 
    <providers> 
    <add type="My.Namespace.MyCustomSqlMembershipProvider" ... />