c# - ASP.NET Membership Provider - 重置密码功能 - 电子邮件确认和密码更改

标签 c# asp.net asp.net-membership forgot-password password-recovery

有没有人有针对以下功能的解决方案(示例代码):

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

我的提供者目前是这样参数化的:

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

已经讨论了此类程序的安全问题here之前。

最佳答案

Rui,几个月前我也遇到过类似的情况,之前没有大量接触成员(member)提供者,我很难正确实现它,因为我认为你必须实现和使用整个事情原样,或者什么都没有。

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

这是我在 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();成员(member)提供商提供的方法和其他方法。

关于你的问题 re Create a randomGuid/Cryptographically strong random number,这里有一个你可以使用的好方法,我不久前找到了它,很抱歉,但不记得在网络上的位置

/// <summary>
/// A simple class which can be used to generate "unguessable" verifier values.
/// </summary>
public class UnguessableGenerator
{
    const string AllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/^()";
    const string SimpleAllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    /// <summary>
    /// Generates an unguessable string sequence of a certain length
    /// </summary>
    /// <param name="length">The length.</param>
    /// <param name="useSimpleCharacterSet">if set to <c>true</c> [use simple character set].</param>
    /// <returns></returns>
    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);
    }




    /// <summary>
    /// Generates an ungessable string, defaults the length to what google uses (24 characters)
    /// </summary>
    /// <returns></returns>
    public static string GenerateUnguessable()
    {
        return GenerateUnguessable(24);
    }
}

为了将包含随机数的唯一 URL 发送到用户的电子邮件地址,您需要在用户表或任何表中存储随机 id,然后在用户发送的电子邮件中精心制作的 url 中使用它可以用来验证。

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

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

希望这对您有所帮助。

关于c# - ASP.NET Membership Provider - 重置密码功能 - 电子邮件确认和密码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3132878/

相关文章:

c# - 无法访问/找到公共(public)枚举/类

c# - 如何追加\in字符串?

c# - 是否有用于 Silverlight 的现代版本 "Deep Zoom Composer"允许将全景图像拼接在一起?

c# - 如何设置包含 *、/、-、% 和 + 等字符的枚举列表

asp.net - HttpContext.Current.Session 为 null + OWIN

c# - ASP.NET 用户控件的编辑、插入、更新模式

c# - Facebook JSON 字符串的反序列化?

.net - 无效用户登录。成员(member)服务。网站

c# - Entity Framework 代码优先和 ASP.NET 成员资格

c# - 如何有效地管理对 Membership.GetUser() 的多次调用