Могу ли я настроить ResetPassword в MembershipProvider Asp.Net? - PullRequest
4 голосов
/ 02 апреля 2010

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

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

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

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

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

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

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

Спасибо ~!

ColoradoTechie

Ответы [ 3 ]

2 голосов
/ 02 апреля 2010

Использование метода 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 может сделать вас одним из самых ненавистных людей.)

2 голосов
/ 02 апреля 2010

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

Эта ссылка описывает ту же тактику, которую вы, похоже, уже используете ....

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

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

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

1 голос
/ 16 февраля 2011

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

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

public virtual string GeneratePassword()

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

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

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