0

我创建了一个授权过滤器

public class LandedAttribute : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext) {
      if (httpContext == null)
         throw new ArgumentNullException("httpContext");
      if (HttpContext.Current.Response.Cookies["LegalDisclaimer"].Value != "Accepted")
      {
         return false;
      }
      return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){
   string url = filterContext.HttpContext.Request.Url.ToString();
   System.Diagnostics.Debug.WriteLine(url);
   filterContext.Result = new RedirectToRouteResult(
   new RouteValueDictionary {
     { "action", "Index" },
     { "controller", "Landing" },
     { "returnUrl", url }
   });
}

}

和我的着陆控制器

public ActionResult Index(string returnUrl)
        {
            ViewBag.rdParm = returnUrl;
            return View();
        }
        public ActionResult Accept(string returnUrl)
        {
            HttpCookie cookie = new HttpCookie("LegalDisclaimer", "Accepted");
            Response.Cookies.Add(cookie);
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

然后我设置了一个控制器

[Landed] 
public class someController : Controller
{
contoller actions here
}

问题是 LegalDisclaimer cookie 从未设置并且总是返回 null。这是我第一次尝试在 mvc 中学习 Authorize 过滤器,并且 3 天没有任何进展。谁能帮我调试一下吗?

4

1 回答 1

1

忽略这一点 - 请参阅下面的更新

看起来您永远无法设置 cookie。我认为,您的 Accept 操作LandingController是唯一设置 cookie 的东西。但是,您永远无法到达那里,因为LandedAttribute您创建的自定义授权过滤器 ( ) 会阻止应用程序到达那里(因为未设置 cookie)。

您可能希望[AllowAnonymous]在该操作上添加一个以允许它通过,以便可以设置 cookie。

例如

[AllowAnonymous]
public ActionResult Accept()
{
    // body of the action here.
}

更新

我刚刚意识到您LandedAttribute正在尝试读取传出的 cookie,而不是传入的 cookie。

你有HttpContext.Current.Response. 在 上使用 cookie Request,而不是Response

您的控制器操作仍应使用响应,因为您正在那里设置传出 cookie。

于 2013-08-24T11:46:50.850 回答