我目前正在ASP.NET Web应用程序中使用MembershipProvider的非常基本的自定义实现。随着我对会员资格的要求越来越高,使用现有的,功能齐全且经过良好测试的实施(如SqlMembershipProvider)似乎很有意义。我已经弄清楚如何使用aspnet_Memebership存储过程从我的自定义表创建用户,但我坚持密码。我的自定义实现不使用salt,而SqlMembershipProvider似乎需要它。
我希望这是我的用户平稳过渡,并且不要求每个人在更改后第一次登录时更新他们的密码。
如何将散列密码从自定义实现(见下文)迁移到SqlMemberhipProvider?
FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.SHA1.ToString())
更新:我应该澄清一下,我的自定义提供程序是MembershipProvider的一个实现,而不是一个功能齐全的提供程序。另外,我尝试使用带有空盐的aspnet _Membership
_ CreateUser,但是哈希值不匹配。
答案 0 :(得分:1)
您可以编写一个自定义哈希算法来删除盐(组合的盐和密码的前16个字节)。
http://forums.asp.net/t/981295.aspx
或者,您可以编写自己的继承MembershipProvider的类,但这样做会更有效。
答案 1 :(得分:1)
您最好的选择是尝试使用空盐手动创建SqlMembership
的用户(通过存储过程)。
如果这不起作用,我认为你对SqlMembershipProvider
运气不好,但你总是可以写自己的MembershipProvider
(甚至可能基于SqlMembershipProvider
'自己的后端)。这并不难。
答案 2 :(得分:0)
重写System.Web.Security.SqlMembershipProvider 类,并覆盖您需要自定义的多个或几个方法。
web.config在这里看不到。但事实上,你有自己的自定义工作首先,我不是那个部分是一个跳闸点。
public class SqlMembershipProviderOverride : System.Web.Security.SqlMembershipProvider
{
public static readonly string FORCED_OVERRIDE_APPLICATION_NAME = "MyApplicationName";
public SqlMembershipProviderOverride()
{
this.ApplicationName = FORCED_OVERRIDE_APPLICATION_NAME;
}
public override System.Web.Security.MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out System.Web.Security.MembershipCreateStatus status)
{
return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
/*
Do "your own thing" in this or any other override method
*/
}
}