我正在开发一个具有多个角色的用户的复杂网站。用户还与数据库中的其他项目相关联,这些项目连同他们的角色将定义他们可以在网站上看到和执行的操作。
现在,有些用户拥有多个角色,但由于结构复杂,网站一次只能处理一个角色。
这个想法是用户登录并在网站的角落有一个下拉菜单,他可以在其中选择他的角色之一。如果他只有 1 个角色,则没有下拉菜单。
现在,我将最后选择的角色值与用户的其他设置一起存储在数据库中。当他回来时,这个角色仍然被记住。
下拉列表的值应该可以在整个网站上访问。我想做两件事:
- 将当前角色存储在
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
- 也许我做错了,有更好的方法吗?
任何帮助是极大的赞赏。