如何从自定义成员资格提供程序迁移到SqlMembershipProvider?

时间:2009-08-17 18:27:24

标签: asp.net membership sqlmembershipprovider

我目前正在ASP.NET Web应用程序中使用MembershipProvider的非常基本的自定义实现。随着我对会员资格的要求越来越高,使用现有的,功能齐全且经过良好测试的实施(如SqlMembershipProvider)似乎很有意义。我已经弄清楚如何使用aspnet_Memebership存储过程从我的自定义表创建用户,但我坚持密码。我的自定义实现不使用salt,而SqlMembershipProvider似乎需要它。

我希望这是我的用户平稳过渡,并且不要求每个人在更改后第一次登录时更新他们的密码。

如何将散列密码从自定义实现(见下文)迁移到SqlMemberhipProvider?

FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.SHA1.ToString())

更新:我应该澄清一下,我的自定义提供程序是MembershipProvider的一个实现,而不是一个功能齐全的提供程序。另外,我尝试使用带有空盐的aspnet _Membership _ CreateUser,但是哈希值不匹配。

3 个答案:

答案 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
        */

    }


}