Asp.net mvc 3 在IIS 7.0中使用自定义MembershipProvider和Roleprovider
我正在写一个ASP.NETMVC3网站。这是我的自定义成员资格提供程序(仅ValidateUser实现): 和我的角色Provider(仅实现GetRolesForUser) 我的web.config部件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
...
<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.0Membership.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();