是否有人拥有以下功能的解决方案(示例代码):
我的提供商目前正在以这种方式进行参数化:
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
name="AspNetSqlMembershipProvider"
之前已经讨论了此类程序的安全问题{。{3}}。
答案 0 :(得分:5)
我很快发现你只能使用它的一部分,而不是整个物体。例如,在我的应用程序中,我有自己的用户对象和我自己的密码和登录模块,但我需要让表单身份验证工作。所以我基本上只使用该部分的成员资格提供者。我没有覆盖任何方法或任何东西,只是将它用于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();会员提供者提供的方法和其他方法。
关于你的问题重新创建一个randomGuid / Cryptographically强大的随机数,这是一个很好的方法,你可以使用,我发现它不久前,我很抱歉,但不记得在网上的哪里
/// <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);
}
}
对于将包含随机数的唯一网址发送到用户的电子邮件地址,您需要在User表或任何表格中存储随机ID,然后在用户发送的电子邮件中使用该网址可以用来验证。
这将要求您创建一个接受该类型网址的网址,然后您必须从查询字符串中提取所需的部分并更新您的用户对象。
对于确认后,系统会要求用户更改密码,默认情况下在您的表格中有一个位标志强制用户更改其密码,如果您需要强制用户更改密码,这也将在以后派上用场。因此,您的登录代码会查看此位标志是否已打开,如果是,则会先强制更改密码。然后,一旦用户更改了密码,您将关闭此标志。
希望这有帮助。
答案 1 :(得分:1)
至少使用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”,它应该链接到dataBase中的用户