【发布时间】:2012-06-24 12:00:00
【问题描述】:
我是一名 CS 专业的,我刚刚完成了 ASP.net 网站的设计,对于该网站,我需要一个登录身份验证系统...我不想使用 SQLMembershipProvider,因为我真的很想学习如何制作一个靠我自己...无论如何,这就是我想出的,我想知道是否有人可以给我一些反馈、提示或建议。
提前致谢
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Security.Cryptography;
/// <summary>
/// Summary description for PwEncrypt
/// </summary>
public class PwEncrypt
{
public const int DefaultSaltSize = 5;
private static string CreateSalt()
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buffer = new byte[DefaultSaltSize];
rng.GetBytes(buffer);
return Convert.ToBase64String(buffer);
}
public static string CreateHash(string password, out string salt)
{
salt = CreateSalt();
string saltAndPassword = String.Concat(password, salt);
string hashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1");
hashedPassword = string.Concat(hashedPassword, salt);
return hashedPassword;
}
public static string CreateHashAndGetSalt(string password, string salt)
{
string saltAndPassword = String.Concat(password, salt);
string hashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPassword, "SHA1");
hashedPassword = string.Concat(hashedPassword, salt);
return hashedPassword;
}
public static bool comparePassword(string insertedPassword, string incUserName, out string newEncryptedPassword, out string originalPassword)
{
databaseInteraction DBI = new databaseInteraction();
string actualPassword ="";
string salt = "";
DBI.getSaltandPassword(incUserName, out salt, out actualPassword);
string hashedIncPassword = PwEncrypt.CreateHashAndGetSalt(insertedPassword, salt);
// hashedIncPassword = string.Concat(hashedIncPassword, salt);
newEncryptedPassword = hashedIncPassword;
originalPassword = actualPassword;
if (newEncryptedPassword == originalPassword)
{
return true;
}
else { return false; }
}
【问题讨论】:
-
如果要创建自定义会员提供者,首先必须从 MemberShipProvider 继承。如果你谷歌一下,这是相当有据可查的。
-
除非您真的别无选择,否则不要尝试推出自己的自定义身份验证和会话管理方案或构建自己的控件。我只是想做,没有资格。有趣的阅读:troyhunt.com/2010/07/…
-
@ChristopheGeers 没错...自己做很麻烦,内置的 MembershipProviders 工作得很好,他们只是必须配置才能这样做。
-
我知道对于生产站点来说确实是这样,但是出于教育目的,您是否真的相信只知道如何通过预先构建的系统来实现身份验证系统是一件好事?因为我清楚地提到了 MembershipProviders,所以我清楚地知道它是什么,并且使用起来很舒服,但并不是每种语言都有它......我只是在寻求有关实施自定义系统的建议或技巧,以实现 OUTSIDE asp.net 之外的教育.至于自己动手做起来很麻烦,只要以后可能有一些好处,这不是一个真正的问题。
-
@user1474120 - 除了你的实现安全是一场噩梦。您的密码哈希不确定。