在IIS 7.0中使用自定义MembershipProvider和Roleprovider

时间:2012-01-16 21:35:49

标签: asp.net-mvc-3 sql-server-2008 iis hash custom-membershipprovider

我正在编写一个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>

关于LogOn操作:

...
 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开发服务器上运行NORMAL。 与MSSQL Server的连接是正常的(我可以获取任何数据并在部署网站时显示它)?没有异常发生,只是总是返回false ...

2 个答案:

答案 0 :(得分:0)

您确定在本地和生产中调用完全相同的代码吗?我怀疑你的代码除了意外之外都会工作。

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

为清晰起见编辑:

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

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

答案 1 :(得分:0)

请勿将GetHashCode用于此目的!使用始终相同的MD5或SHA1安全哈希。 GetHashCode can return different values between different versions of .NET framework。在32位和64位系统上使用时,它也会返回不同的值。