我正在開發一個擁有多個角色的用戶的複雜網站。用戶還可以與數據庫中的其他項目結合使用,並與他們的角色一起定義他們可以在網站上看到和做的事情。現在Asp.net MVC讓用戶在角色之間切換
,一些用戶已經超過1層的作用,但該網站只能同時處理,因爲結構複雜1層的作用。
的想法是,在用戶登錄,並在該網站,他可以選擇他的一個角色拐角處的下拉菜單。如果他只有一個角色,那麼就沒有下拉。
現在我在DB的最後選擇的角色值存儲與用戶自己的其他設置。當他回來時,這種角色仍然被記住。
下拉的值應該是在整個網站的訪問。 我想做2件事:
- 將當前角色存儲在
Session
。 - 重寫
IsInRole
方法或寫IsCurrentlyInRole
方法來檢查所有進入當前選定的角色,而不是所有的角色一樣,原來IsInRole
方法
對於會話的一部分存儲我想那會Global.asax
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
if (User != null && User.Identity.IsAuthenticated) {
//check for roles session.
if (Session["CurrentRole"] == null) {
NASDataContext _db = new NASDataContext();
var userparams = _db.aspnet_Users.First(q => q.LoweredUserName == User.Identity.Name).UserParam;
if (userparams.US_HuidigeRol.HasValue) {
var role = userparams.aspnet_Role;
if (User.IsInRole(role.LoweredRoleName)) {
//safe
Session["CurrentRole"] = role.LoweredRoleName;
} else {
userparams.US_HuidigeRol = null;
_db.SubmitChanges();
}
} else {
//no value
//check amount of roles
string[] roles = Roles.GetRolesForUser(userparams.aspnet_User.UserName);
if (roles.Length > 0) {
var role = _db.aspnet_Roles.First(q => q.LoweredRoleName == roles[0].ToLower());
userparams.US_HuidigeRol = role.RoleId;
Session["CurrentRole"] = role.LoweredRoleName;
}
}
}
}
}
但顯然這會導致運行時錯誤。 Session state is not available in this context.
- 我該如何解決這個問題,而這是真的 把這個 代碼的最佳地點?
- 如何擴展用戶(
IPrincipal
?)有IsCurrentlyInRole
不失所有其他功能 - 也許我這樣做是完全錯誤的,有一個更好的方式來做到這一點?
任何幫助,非常感謝。
非常有趣!我有點固定它與會議和所有,但我可能會使用部分代碼來改善它。我也覆蓋了`AuthorizeAttribute`會話會很快失去它的價值,這使得我需要每次檢查它並經常重新加載它。我會提出我的最終代碼,以便儘快查看。 – Stefanvds 2011-02-18 17:04:36