0

我正在编写一个 ASP.NET MVC 3 网站。这是我的自定义 MembershipProvider(仅 ValidateUser 实现):

public class RFMMembershipProvider : MembershipProvider
{
    IUserService userService = new UserService();

    public override bool ValidateUser(string username, string password)
    {
        return password.GetHashCode().ToString() == userService.GetUser(username).Pass;
    }
...
}

和我的 Roleprovider(仅实现 GetRolesForUser)

public class RFMRoleProvider : RoleProvider
{
    IUserService userService = new UserService();

    public override string[] GetRolesForUser(string username)
    {
        return new string[] { userService.GetRolesForUser(username).Name };
    }
...
}

我的 web.config 部分

...
<system.web>

<roleManager enabled="true" defaultProvider="RFMRoleProvider">
  <providers>
    <clear/>
    <add name="RFMRoleProvider" type="RFMSite.WebUI.RFMRoleProvider, RFMSite"/>
  </providers>
</roleManager>

<membership defaultProvider="RFMMembershipProvider"
            >
  <providers>
    <clear/>
    <add name="RFMMembershipProvider"
         type="RFMSite.WebUI.RFMMembershipProvider, RFMSite"
         />
  </providers>
</membership>

<authentication mode="Forms" >
  <forms loginUrl="~/Account/LogOn" timeout="2880">
  </forms>
</authentication>

登录操作:

...
 if (Membership.ValidateUser(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, true);
                return RedirectToAction("Files", "Admin");
            }
...
return View();

所以问题是为什么当我在 IIS 7.0 上发布站点时Membership.ValidateUser(username, password) 总是返回 false?它在本地 asp.net 开发服务器上正常工作。与 MSSQL Server 的连接是否正常(我可以获取任何数据并在网站部署时显示)?没有异常发生,只是总是返回 false ......

4

2 回答 2

0

你确定你在本地和生产中调用完全相同的代码吗?我怀疑您的代码将永远工作,除非是偶然的。

具体来说,我怀疑它String.GetHashCode()是否会从您的数据库中返回与密码匹配的内容,除非您的用户习惯于使用长随机数作为密码。GetHashCode用于构建哈希表,而不是用于保护密码。我认为您将其与HashPasswordForStoringInConfigFile或类似的东西混淆了。

为清楚起见编辑:

我不确定这GetHashCode是你的问题,但我没有看到任何其他明显错误的地方。测试起来很容易:将您的哈希码记录到日志文件中,因为它们无论如何都是临时的(正如您在评论中指出的那样)。

是的,GetHashCode 可以在您部署时轻松更改;例如,如果您正在运行不同的架构,或者针对较新版本的框架,则从 GetHashCode 返回的确切值肯定会有所不同。

于 2012-01-16T21:44:36.193 回答
0

请勿GetHashCode用于此目的!使用始终相同的 MD5 或 SHA1 安全哈希。GetHashCode .NET 框架的不同版本之间可以返回不同的值。在 32 位和 64 位系统上使用时,它还会返回不同的值。

于 2012-01-17T09:55:11.137 回答