我在寫一個ASP.NET MVC 3網站。這是我的自定義的MembershipProvider(僅實現的ValidateUser):在IIS 7.0中使用自定義MembershipProvider和Roleprovider
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服務器的連接是好的(我可以獲取任何數據並在網站部署時顯示)?沒有異常發生,只是總是返回假...
好的,當我向數據庫寫入pass數據時,我做了pass.GetHashCode()。ToString(),實際上是字符串寫入數據庫。我明白這是個壞主意 - 這種解決方案是暫時的。你的意思是,當在IIS上delpoyed GetHashCode()方法返回不同的字符串? – 2012-01-16 21:54:59
我的意思是GetHashCode的實現不是你應該依賴的;框架的不同版本,版本,體系結構等可以(並且已經)改變它。這完全是一個內部的實現級別細節。除此之外,那些哈希碼甚至不是唯一的:碰撞是散列表的正常部分,因此可以很容易地構造散列到同一個桶的多個密碼。 – 2012-01-17 16:08:52
是啊,非常棒!你真的是對的! GetHashCode()當相同的字符串返回不同的值,當網站託管在IIS和在asp.net webdev服務器 – 2012-01-17 19:24:11