asp.net-mvc - 加密后仍可读取FormsAuthenticationTicket用户数据(带有表单Auth。的ASP.NET MVC3)

标签 asp.net-mvc asp.net-mvc-3

我使用新的ASP.NET MVC3框架并使用FormsAuth构建网站。用于保护网站。我将用户的角色存储在FormsAuthenticationTicket的UserData属性中(手动设置cookie),然后在将票证添加到cookie之前调用票证上的crypto方法(请参阅下面的标准票证片段)。

if (Validate(model.UserName, model.Password))
                {                     
                    FormsAuthenticationTicket authTicket =  new FormsAuthenticationTicket(1,
                            model.UserName,
                            DateTime.Now,
                            DateTime.Now.AddMinutes(30),
                            false,
                            UserType.Administrator.ToString());
                    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
                    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                    Response.Cookies.Add(faCookie);   
                    return RedirectToAction("startpage", "mycontroller");
                }
            }     

现在,我制作了一个自定义AuthorizeAttribute,它可以检查用户是否已通过1.身份验证并具有2.管理员角色(从票证中获得)。 (下面)
当在具有属性注释的类中执行操作时,将调用此派生类的AuthorizeCore方法。
protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            IPrincipal user = httpContext.User;
            if (!user.Identity.IsAuthenticated)
            {
                return false;
            }
            string cookieName = FormsAuthentication.FormsCookieName;
            HttpCookie authCookie = httpContext.Request.Cookies[cookieName];
            if (authCookie == null)
                return false;

            FormsAuthenticationTicket authTicket =       FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket.UserData != UserType.Administrator.ToString())
                return false;
            return true;

所以这就是我感到困惑的地方。

当我跟踪正在执行的代码(在调试中使用有效的凭据),并检查每一行所做的变量的值时,加密的票证会加密,然后再将其添加到reponsecookie中。

但是,当我在调用控制器(索引页)时检查AuthorizeCore方法时,其获取的参数HttpContext包含未加密的票证,因此在读取cookie时不再需要解密票证。

为什么我会在登录控制器中成功地将票证加密,然后将票证发送回客户端,但是当我在AuthorizeAdministrator类中收到httpcontext时,它再次全部未加密。

很长的问题/故事,很抱歉,答案可能很简单。
希望我的故事讲得清楚。

谢谢。

最佳答案

Forms auth需要在页面处理管道的早期对Cookie进行解密,以确定用户是否已获得授权-即在用户填写User.Identity等详细信息时。

关于asp.net-mvc - 加密后仍可读取FormsAuthenticationTicket用户数据(带有表单Auth。的ASP.NET MVC3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547107/

相关文章:

asp.net-mvc-3 - 在 MVC3 中相互验证模型集合

asp.net-mvc - MVC 3 要求 System.Web 版本 2.0.0.0 (System.Web.UI.Controls) : Is this a compiler bug?

asp.net-mvc - ASP.NET MVC TextBoxFor 占位符

c# - 请提供引用/指导以在 Asp.Net MVC(C#) 中制作用于管理邮件(如 Microsoft Outlook)的 Web 应用程序

c# - EntityFramework 5.0 中的基类/实体

html - 关于 ActionLinks 和普通 a-tag 超链接的小 MVC 样式问题

c# - 从架构的角度来看,Session[] 或 Encrypted Cookies 的最佳方法是什么?

asp.net - ASP MVC ActionLink 导致 URL 无效

javascript - 使用javascript在MVC3中验证表单

c# - 为什么 Request.Url.Authority 返回内部路径而不是我的域