如何在AuthorizeAttribute中使用域访问cookie

时间:2017-05-12 22:23:10

标签: c# asp.net-mvc cookies attributes

我有以下AuthorizeAttribute

  public class SSOAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var cookie = httpContext.Request.Cookies["testcookie"];
        if (cookie == null)
        {
            Debug.WriteLine("cookie does not exist in attribute");
            cookie = new HttpCookie("testcookie")
            {
                Value = "test",
                Domain = "someotherdomain"
            };
            httpContext.Response.Cookies.Add(cookie);
        }
        else
            Debug.WriteLine("cookie exists in attribute");
        return true;
    }
}

和以下控制器(MVC 5.0)

  [SSO]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var cookie = HttpContext.Request.Cookies["testcookie"];
        if (cookie == null)
            Debug.WriteLine("cookie does not exist in Index");
        else
            Debug.WriteLine("cookie exists in Index");

        return RedirectToAction("Second");
    }

    public ActionResult Second()
    {
        var cookie = HttpContext.Request.Cookies["testcookie"];
        if (cookie == null)
            Debug.WriteLine("cookie does not exist in Second");
        else
            Debug.WriteLine("cookie exists in Second");

        return View("Index");
    }
}

运行此测试应用程序时,输出为

  属性

中不存在

cookie      

cookie存在于索引

中      属性

中不存在

cookie      

cookie存在于第二个

没有域名,一切正常。该属性在第二次传递时按预期查找cookie。然而,一旦我添加域,该属性在搜索cookie时返回null。它仍然在控制器中显示得很好。有人可以解释为什么会这样,以及如何在属性中看到这个cookie?

1 个答案:

答案 0 :(得分:0)

您没有在属性中看到Cookie的原因是因为它是为不同的域设置的,因此浏览器甚至没有随请求发送它。在提出请求时尝试运行Fiddler;您应该会看到您在其他域名中设置的Cookie未包含在您正在制作的请求中。

您每次都在控制器中看到Cookie的原因是因为您每次都会在属性中重新设置它,因为该属性最初未找到,因为该属性在控制器被击中之前运行。将cookie值设置为某个变量,如DateTime.Now.ToString(),并将其打印到Debug以查看我的意思。