Поставщик членства ASP.NET - функции пароля сброса - электронное письмо с подтверждением и изменение пароля

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

  • Создайте 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"

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

13
задан Community 23 May 2017 в 12:00
поделиться

2 ответа

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

1
ответ дан 2 December 2019 в 01:56
поделиться

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

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

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

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

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

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

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

5
ответ дан 2 December 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: