Поставщик членства в ASP.NET - функции сброса пароля - подтверждение по электронной почте и смена пароля - PullRequest
13 голосов
/ 28 июня 2010

Есть ли у кого-нибудь решение (пример кода) для следующих функций:

  • Создание случайного числа случайных чисел / криптографически сильных
  • Отправка уникального URL-адреса, содержащего случайное число,адрес электронной почты пользователя
  • После подтверждения пользователю предлагается сменить пароль

Мой провайдер в настоящее время параметризован следующим образом:

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

Проблемы безопасности с этимтип процедуры обсуждался здесь ранее.

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

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

Ну, я скоро обнаружил, что вы можете использовать только его части, а не весь объект.Например, в моем приложении у меня есть свой собственный пользовательский объект и мои собственные модули пароля и входа, но мне нужно, чтобы работала аутентификация форм.Так что я просто использую членство для этой части.Я не отменяю никаких методов или чего-либо еще, просто использую его для 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 ();методы и другие методы, предоставляемые провайдером членства.

По вашему вопросу повторно создайте случайное числовое / криптографически сильное случайное число, вот хороший метод, который вы можете использовать, я нашел его некоторое время назад, и я извиняюсь, ноне могу вспомнить, где в сети

/// <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-адреса, содержащего случайное число, на адрес электронной почты пользователя, что вам нужно, это в вашей таблице пользователя или любой таблице способ хранения случайного идентификатораа затем используйте его в специально созданном URL-адресе в электронном письме, которое пользователь может использовать для проверки.

Для этого потребуется создать URL-адрес, который будет принимать этот тип URL-адреса, а затем вам придется извлечь части, которые вынеобходимо сформировать строку запроса и обновить ваш пользовательский объект.

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

Надеюсь, это поможет.

1 голос
/ 07 июля 2010

По крайней мере, используйте класс 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», на которые она должна ссылаться пользователю в базе данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...