在使用基于窗体的身份验证进行角色管理时,在登录的时候将用户的角色取出,然后放入FormsAuthenticationTicket构造函数的userdata中,在global.asax文件的Application_AuthenticateRequest事件中设置为用户的角色,以后就可以在程序中if (User.IsInRole("Admin")){这样写代码了,这没有任何问题。我想问的是,一般都是在登录的时候把用户的角色从数据库取出到程序中,然后再付给用户,可是如果在用户登录后,而此时管理员给这个用户删除了某个角色,那么用户此时会不会仍然有这个角色而造成错误?例如,用户user1在登录时有count,admin两个角色,在用户user1登录后进行操作的同时,系统管理员在数据库中删除了该用户的admin角色,也就是说现在用户user1不再是管理员了,那么他如果此时仍然进行admin角色的管理工作,就会造成系统的错误,是不是他只有重新登录系统才能获得它的新的角色呢?大家对于这个问题是如何处理的?
public FormsAuthenticationTicket(
int version, //设为1
string name, //用户标示
DateTime issueDate, //Cookie 的发出时间, 设置为 DateTime.Now
DateTime expiration, //过期时间
bool isPersistent, //是否持久性(根据需要设置,若是设置为持久性,在发出
cookie时,cookie的Expires设置一定要设置)
string userData, //这里用上面准备好的用逗号分割的role字符串
string cookiePath // 设为"/",这要同发出cookie的路径一致,因为刷新cookie
要用这个路径
);FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket (1,"kent",DateTime.Now, DateTime.Now.AddMinutes(30), false,UserRoles,"/") ;
在global.asax中:protected void Application_AuthorizeRequest(object sender, System.EventArgs e)
{
HttpApplication App = (HttpApplication) sender;
HttpContext Ctx = App.Context ; //获取本次Http请求相关的HttpContext对象
if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
{
FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据转成字符串数组
Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
}
}
如果改变角色,我想应该是要重新登陆之后才生效才对的.
不然系统就要有一个强制下线的功能.将该用户踢吓线.
如果有删除角色信息的需求, 那么再附加时进行预处理就行了.