0

我在寫一個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服務器的連接是好的(我可以獲取任何數據並在網站部署時顯示)?沒有異常發生,只是總是返回假...

回答

0

你確定你在本地和生產中調用完全相同的代碼嗎?我很懷疑你的代碼能夠工作,除非意外。

具體而言,我懷疑String.GetHashCode()將永遠不會返回與您的數據庫中的密碼相匹配的內容,除非您的用戶習慣使用長隨機數作爲其密碼。 GetHashCode用於構建散列表,而不是用於保護密碼。我認爲你用HashPasswordForStoringInConfigFile或類似的東西來混淆它。

編輯清晰:

我不知道肯定GetHashCode是你的問題,但我沒有看到任何東西顯然是錯誤的。測試會很容易:將你的哈希碼記錄到一個日誌文件中,因爲它們是臨時的(正如你在評論中所記錄的那樣)。

是的,當你部署時,GetHashCode很容易改變;如果您正在運行不同的體系結構,或者針對較新版本的Framework,則從GetHashCode返回的確切值肯定會不同。

+0

好的,當我向數據庫寫入pass數據時,我做了pass.GetHashCode()。ToString(),實際上是字符串寫入數據庫。我明白這是個壞主意 - 這種解決方案是暫時的。你的意思是,當在IIS上delpoyed GetHashCode()方法返回不同的字符串? – 2012-01-16 21:54:59

+0

我的意思是GetHashCode的實現不是你應該依賴的;框架的不同版本,版本,體系結構等可以(並且已經)改變它。這完全是一個內部的實現級別細節。除此之外,那些哈希碼甚至不是唯一的:碰撞是散列表的正常部分,因此可以很容易地構造散列到同一個桶的多個密碼。 – 2012-01-17 16:08:52

+0

是啊,非常棒!你真的是對的! GetHashCode()當相同的字符串返回不同的值,當網站託管在IIS和在asp.net webdev服務器 – 2012-01-17 19:24:11

相關問題