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();方法以及其他会员提供的方法。
关于创建一个随机的Guid/密码强度随机数的问题,这里有一个不错的方法,我之前找到过,但是很抱歉我不能记得在网上的具体位置。
public class UnguessableGenerator
{
const string AllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/^()";
const string SimpleAllowableCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
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);
}
public static string GenerateUnguessable()
{
return GenerateUnguessable(24);
}
}
为了向用户发送包含随机数的唯一链接,您需要在用户表或任何表中存储一个随机ID,并将其用于电子邮件中的构建URL,以供用户验证。
这将要求您创建一个接受此类URL的URL,然后从查询字符串中提取所需部分并更新用户对象。
当确认后,系统会要求用户更改密码。在您的表中默认有一个比特标志,用于强制用户更改密码,如果您需要强制用户更改密码,则此功能非常有用。因此,您的登录代码将查看该比特标志是否打开,如果是,则首先强制用户更改密码。一旦用户更改了密码,您将关闭此标志。
希望这可以帮助您。