我正在编写一个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 ...
答案 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位系统上使用时,它也会返回不同的值。