Asp.net mvc 3 在IIS 7.0中使用自定义MembershipProvider和Roleprovider

Asp.net mvc 3 在IIS 7.0中使用自定义MembershipProvider和Roleprovider,asp.net-mvc-3,sql-server-2008,iis,hash,custom-membershipprovider,Asp.net Mvc 3,Sql Server 2008,Iis,Hash,Custom Membershipprovider,我正在写一个ASP.NETMVC3网站。这是我的自定义成员资格提供程序(仅ValidateUser实现): 和我的角色Provider(仅实现GetRolesForUser) 我的web.config部件 ... <system.web> <roleManager enabled="true" defaultProvider="RFMRoleProvider"> <providers> <clear/> <add nam

我正在写一个ASP.NETMVC3网站。这是我的自定义成员资格提供程序(仅ValidateUser实现):

和我的角色Provider(仅实现GetRolesForUser)

我的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>
所以问题是为什么我在IIS7.0
Membership.ValidateUser(用户名、密码)
总是返回false?它在本地asp.net开发服务器上正常工作。
与MSSQL服务器的连接是否正常(我可以获取任何数据并在网站部署时显示)?没有异常发生,只是始终返回false…

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

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

为清晰起见,请编辑:

我不确定
GetHashCode
是否是你的问题,但我看不出还有什么明显的问题。测试很容易:将哈希代码记录到日志文件中,因为它们是临时的(正如您在注释中所指出的)


是的,当您部署时,GetHashCode可以很容易地更改;例如,如果您运行的是不同的体系结构,或者针对框架的较新版本,那么从GetHashCode返回的确切值肯定会不同。

不要为此使用
GetHashCode
!使用始终相同的MD5或SHA1安全哈希
GetHashCode
。在32位和64位系统上使用时,它也会返回不同的值。

ok,当我向数据库写入pass数据时,我确实会传递.GetHashCode().ToString(),实际上该字符串会写入数据库。我明白这是个坏主意——这种解决办法是暂时的。你的意思是GetHashCode()方法在IIS上delpoyed时返回不同的字符串?我的意思是GetHashCode实现不是你应该依赖的东西;框架的不同版本、版本、体系结构等可以(并且已经)改变它。这完全是一个内部的、实现级别的细节。除此之外,这些散列码甚至不是唯一的:冲突是散列表的正常部分,因此很容易构造多个散列到同一个存储桶的密码。是的,太棒了!!你真的是对的!当网站托管在iis和asp.net webdev服务器上时,GetHashCode()fjr同一字符串返回不同的值
public class RFMRoleProvider : RoleProvider
{
    IUserService userService = new UserService();

    public override string[] GetRolesForUser(string username)
    {
        return new string[] { userService.GetRolesForUser(username).Name };
    }
...
}
...
<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();