0

我目前在 ASP.NET Web 应用程序中使用MembershipProvider的一个非常基本的自定义实现。随着我对成员资格要求的增加,使用现有的、功能齐全且经过良好测试的实现(如SqlMembershipProvider)似乎很有意义。我已经想出了如何使用 aspnet_Memebership 存储过程从我的自定义表创建用户,但我被困在密码上。我的自定义实现不使用盐,而 SqlMembershipProvider 似乎需要它。

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

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

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

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

4

3 回答 3

1

您可以编写一个自定义哈希算法来删除盐(组合的盐和密码的前 16 个字节)。

http://forums.asp.net/t/981295.aspx

或者,您可能会编写自己的继承 MembershipProvider 的类,但这将是更多的工作。

于 2009-08-17T18:45:45.150 回答
1

您最好的选择是尝试使用SqlMembership手动(通过存储过程)创建用户。

如果这不起作用,我认为SqlMembershipProviderMembershipProviderSqlMembershipProvider. 这并不难。

于 2009-08-17T19:03:17.377 回答
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
        */

    }


}
于 2012-02-07T18:58:16.750 回答