none
Global文件判断session 的用户名 RRS feed

  • 问题

  • 登录时,取到用户名和角色, 保存为
    Session["Account"] = UserName;
    Session["Roles"] = UserRoles;

    在Global.asax文件中,写下:

      protected void Application_AuthenticateRequest(object sender, System.EventArgs e)
            {
                HttpApplication App = (HttpApplication)sender;
                HttpContext Ctx = App.Context;

                if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
                {
                    FormsIdentity Id = (FormsIdentity)Session["Account"];
                    string TempRoles = Session["Roles"].ToString();
                    string[] Roles = TempRoles.Split(',');
                    Ctx.User = new GenericPrincipal(Id, Roles);
                }
            }

    无法执行角色组的权限,不知道毛病出在哪里?

    2009年11月17日 9:13

答案

全部回复

  • FormsIdentity identity = (FormsIdentity) Ctx.User.Identity;
    【孟子E章】
    2009年11月17日 9:20
    版主

  •                 FormsIdentity Id = (FormsIdentity)Ctx.Session["Account"];
                    string TempRoles = Ctx.Session["Roles"].ToString();
    改了这样, 也不行啊
    2009年11月17日 9:25
  • FormsIdentity Id = (FormsIdentity)Session["Account"];???
    你这个seesin存储是字符串 不是  FormsIdentity 标识
    2009年11月17日 9:30
  • FormsIdentity Id = (FormsIdentity)Session["Account"];???
    你这个seesin存储是字符串 不是  FormsIdentity 标识

    (FormsIdentity)这里强制转换不过来吗?
    我是根据您提供给我的博客来学习的. 那个博客是保存为cookie, 但看到很多人都说要保存在 session 比较安全. 所以想保存在session.

    您帮我改一改了, 我弄两天了,都搞不过来.
    2009年11月17日 9:36
  • 你这个安全过头了 FormsIdentity是cookie的value 解密后的用的
    http://www.cnblogs.com/itspice/archive/2004/12/03/72477.html
    • 已标记为答案 lfj0912 2009年11月18日 7:02
    2009年11月17日 10:04
  • 谢谢您!
    如果不用cookie, 直接获取session的值来判断,在Global.asax中该怎么做?
    Session["Account"] = UserName;
    Session["Roles"] = UserRoles;
    2009年11月17日 16:51

  •         protected void Application_AuthenticateRequest(object sender, System.EventArgs e)
            {
                HttpApplication App = (HttpApplication)sender;
                HttpContext Ctx = App.Context;

                if (Ctx.Request.IsAuthenticated == true) 
                {
                    string GenId = Ctx.Session["Account"].ToString();
                    GenericIdentity MyIdentity = new GenericIdentity(GenId);

                    string TempRoles = Ctx.Session["Roles"].ToString();
                    string[] MyStringArray = TempRoles.Split(','); 

                    Ctx.User = new GenericPrincipal(MyIdentity, MyStringArray);
                }
            }

    不知道怎么办?这样还不行?

    2009年11月18日 4:44
  • 请参考成熟的例子。放Session里不是一个好做法。Session会经常丢失,并且不能使用多个Web 园的场合。


    【孟子E章】
    • 已标记为答案 lfj0912 2009年11月18日 7:02
    2009年11月18日 5:52
    版主
  • 谢谢!
    查了FormsAuthentication的资料, 好像只支持票据传输。认命了。
    再问一下,下面两句的命令

     Context.Response.Cookies.Add (UserCookie) ; //这句是直接写在客户端的硬盘上吗?
    Context.Response.AppendCookie(UserCookie); //这句是写在客户端的内存缓存吗?追加到当前缓存的cookie吗?
    2009年11月18日 6:44
  • 谢谢!
    查了FormsAuthentication的资料, 好像只支持票据传输。认命了。
    再问一下,下面两句的命令

     Context.Response.Cookies.Add (UserCookie) ; //这句是直接写在客户端的硬盘上吗?
    Context.Response.AppendCookie(UserCookie); //这句是写在客户端的内存缓存吗?
    都在磁盘上
    FormsAuthentication 可以使用UserData传递更多的信息。不过cookie有大小限制的。
    验证信息不应当传递复杂的对象信息。即使Session,存储很多对象也是不好的。

    【孟子E章】
    • 已标记为答案 lfj0912 2009年11月18日 7:02
    2009年11月18日 6:50
    版主