2009-07-14 61 views
0

我正在使用帶有特殊角色「必須更改密碼」的ASP.NET角色。如果用戶的密碼超過90天未更改,則會自動添加到此角色。這發生在用戶登錄過程中。授權規則然後拒絕該角色訪問除「更改密碼」頁面之外的所有應用程序。ASP.NET問題在Cookie中緩存角色

通常情況下,這種方式效果很好,但角色緩存Cookie用於緩存角色時存在問題。會發生什麼情況是在登錄過程中,密碼上次更改日期被檢查,如果> 90天,用戶被添加到「必須更改密碼」角色。在相同的頁面請求中,我隨後調用Roles.IsUserInRole(「必須更改密碼」)來決定是否將用戶重定向到更改密碼頁面。這是崩潰的地方 - 似乎啓用角色緩存cookie後,Roles.IsUserInRole(「必須更改密碼」)沒有意識到我已更改此用戶的角色映射,並返回false。但是,在下一頁請求中,Roles.IsUserInRole(「必須更改密碼」)返回true。

此行爲已通過設置cacheRolesInCookie =「false」得到解決,但似乎付出了很高的代價。有其他解決這個問題的方法嗎?

回答

0

實際上,我發現了這個問題 - 這不是緩存cookies中的角色問題,而是Roles.IsUserInRole()的問題。如果我使用重載Roles.IsUserInRole(用戶名,角色),那麼它工作正常,有或沒有角色緩存在一個cookie中。

0

既然你說問題存在於同一個請求中,那麼在HttpContext.Current.Items集合中設置一個項目以表明用戶必須更改它們的密碼,並檢查cookie和HttpContext.Current .Items集合稍後在代碼中?

1

另一個,IMHO更優雅,解決方法是投HttpContext.UserRolePrincipal和添加新的角色向用戶(read more on RolePrincipal.SetDirty)之後調用SetDirty方法。

IsInRole或GetRolesForUser方法的下一次調用應觸發對默認RoleProvider的請求。