在使用基于窗体的身份验证进行角色管理时,在登录的时候将用户的角色取出,然后放入FormsAuthenticationTicket构造函数的userdata中,在global.asax文件的Application_AuthenticateRequest事件中设置为用户的角色,以后就可以在程序中if (User.IsInRole("Admin")){这样写代码了,这没有任何问题。我想问的是,一般都是在登录的时候把用户的角色从数据库取出到程序中,然后再付给用户,可是如果在用户登录后,而此时管理员给这个用户删除了某个角色,那么用户此时会不会仍然有这个角色而造成错误?例如,用户user1在登录时有count,admin两个角色,在用户user1登录后进行操作的同时,系统管理员在数据库中删除了该用户的admin角色,也就是说现在用户user1不再是管理员了,那么他如果此时仍然进行admin角色的管理工作,就会造成系统的错误,是不是他只有重新登录系统才能获得它的新的角色呢?大家对于这个问题是如何处理的?

解决方案 »

  1.   

    首先要根据用户标示,和用户属于的角色的字符串来创建身份验证票
    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信息
        }
    }
      

  2.   

    角色用户等信息不是已记录在SESSION或COOKIE里面吗?
    如果改变角色,我想应该是要重新登陆之后才生效才对的.
    不然系统就要有一个强制下线的功能.将该用户踢吓线.
      

  3.   

    这取决于你是怎么存储/缓存角色的如果你说的情况是个需求,可以这么做,要么是每次登陆都从数据库读取他的角色,或者有个共享的数据,可以检查当前用户的credentials是否改变,如果改变的话,要么更新他缓存的角色,或者强迫他重新登陆 (FormsAuthentication.SignOut(), Response.Redirect()...)
      

  4.   

    一般使用中, 角色都不放入Cookie中, 所以需要每次请求都要附加角色信息, 这时如果更改了角色信息, 自然在下次请求时就已经更改了, 这不必多虑! 
    如果有删除角色信息的需求, 那么再附加时进行预处理就行了.