ASP.NET成员资格提供程序 – 重置密码function – 电子邮件确认和密码更改

有没有人有以下function的解决方案(示例代码):

  • 创建randomGuid / Cryptographically强随机数
  • 将包含随机数的唯一URL发送到用户的电子邮件地址
  • 确认后,系统会要求用户更改密码

我的提供者目前通过这种方式进行参数化:

enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetSqlMembershipProvider" 

之前已经讨论过这种类型的过程的安全问题。

芮,我几天前在一艘类似的船上,以前没有多少接触过会员提供商,我努力让它得到适当的实施,因为我认为你必须实现和使用整个事情。 ,或者什么都没有。

好吧,我很快发现你只能使用它的一部分,而不是整个物体。 例如,在我的应用程序中,我有自己的用户对象和我自己的密码和登录模块,但我需要让表单身份validation工作。 所以我基本上只使用该部分的成员资格提供者。 我没有覆盖任何方法或任何东西,只是将它用于FormsAuthentication,然后我使用自己的存储库来更改密码,validation用户名密码等。

这是我在MVC中的登录代码的片段。

  var authTicket = new FormsAuthenticationTicket(1, user.UniqueName, DateTime.UtcNow, DateTime.UtcNow.AddHours(2), rememberMe, cookieValues); var encryptedTicket = FormsAuthentication.Encrypt(authTicket); var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Expires = DateTime.UtcNow.AddDays(14) }; httpResponseBase.Cookies.Add(authCookie); 

这使我能够使用FormsAuthentication.SignOut(); 成员资格提供者提供的方法和其他方法。

关于你的问题重新创建一个randomGuid / Cryptographically强大的随机数,这是一个很好的方法,你可以使用,我发现它不久前,我很抱歉,但不记得在网上

 ///  /// A simple class which can be used to generate "unguessable" verifier values. ///  public class UnguessableGenerator { const string AllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/^()"; const string SimpleAllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; ///  /// Generates an unguessable string sequence of a certain length ///  /// The length. /// if set to true [use simple character set]. ///  public static string GenerateUnguessable(int length, bool useSimpleCharacterSet = false, string additionalCharacters = "") { var random = new Random(); var chars = new char[length]; var charsToUse = useSimpleCharacterSet ? SimpleAllowableCharacters : AllowableCharacters; charsToUse = string.Format("{0}{1}", charsToUse, additionalCharacters); var allowableLength = charsToUse.Length; for (var i = 0; i < length; i++) { chars[i] = charsToUse[random.Next(allowableLength)]; } return new string(chars); } ///  /// Generates an ungessable string, defaults the length to what google uses (24 characters) ///  ///  public static string GenerateUnguessable() { return GenerateUnguessable(24); } } 

对于将包含随机数的唯一URL发送到用户的电子邮件地址,您需要在User表或任何表中存储随机ID,然后在电子邮件中的精心制作的URL中使用该URL,用户可以使用校验。

这将要求您创建一个接受该类型Url的Url,然后您必须从查询字符串中提取所需的部分并更新您的用户对象。

对于确认后,系统会要求用户更改密码,默认情况下,您的表中会有一个强制用户更改密码的位标志,如果您需要强制用户更改密码,这也会在以后派上用场。 因此,您的登录代码会查看此位标志是否已打开,如果是,则会先强制更改密码。 然后,一旦用户更改了密码,您将关闭此标志。

希望这可以帮助。

至少使用Guid类作为guid。 您可以自定义结果

 var guid = Guid.NewGuid(); 

…..发送链接

 var msg = new MailMessage(); msg.From = new MailAddress("YOUR_ADDRESS"); msg.To.Add(new MailAddress("CLIENT_ADDRESS")); msg.Subject = "YOUR SUBJECT"; msg.Body = @" SOME TXT.... http:\\resetPassword.aspx?guid=" + guid; var smtpClient = new SmtpClient("SMTP_SERVER", 9990); smtpClient.Send(msg); 

…..

在你只需要做一个像resetPassword.aspx这样的网页并在页面中处理后,加载参数“guid”,它应该链接到dataBase中的用户