Ответ 1
Rui, я был в подобной лодке несколько месяцев назад и не имел большой степени воздействия на поставщика членства раньше, я изо всех сил старался, чтобы он был реализован должным образом, потому что я думал, что вам нужно реализовать и использовать все вещь как есть, или вообще ничего.
Хорошо, я скоро обнаружил, что вы можете использовать только его части, а не весь объект. Например, в моем приложении у меня есть свой собственный объект пользователя и мои собственные пароли и модули для входа, но мне нужно было заставить работать с проверкой подлинности. Поэтому я в основном просто использую провайдер членства для этой части. Я не переопределяю какие-либо методы или что-то еще, просто использую его для 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(); методы и другие методы, предоставляемые поставщиком членства.
На ваш вопрос re Создайте случайное число randomGuid/Криптографически сильное случайное число, вот хороший метод, который вы можете использовать, я нашел его некоторое время назад, и я сожалею, но не могу вспомнить, где в Интернете
/// <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, а затем вы должны извлечь нужные вам элементы из запроса и обновить свой пользовательский объект.
В случае подтверждения, пользователю предлагается сменить пароль, по умолчанию в вашем таблице есть бит, который заставляет пользователя сменить пароль, это также будет полезно позже, если вам нужно заставить пользователя сменить пароль, Таким образом, ваш код входа выглядит так, чтобы видеть, включен ли этот бит, и если это так, это заставит сначала сменить пароль. Затем, как только пользователь изменит свой пароль, вы отключите этот флаг.
Надеюсь, что это поможет.