我有以下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?
答案 0 :(得分:0)
您没有在属性中看到Cookie的原因是因为它是为不同的域设置的,因此浏览器甚至没有随请求发送它。在提出请求时尝试运行Fiddler;您应该会看到您在其他域名中设置的Cookie未包含在您正在制作的请求中。
您每次都在控制器中看到Cookie的原因是因为您每次都会在属性中重新设置它,因为该属性最初未找到,因为该属性在控制器被击中之前运行。将cookie值设置为某个变量,如DateTime.Now.ToString()
,并将其打印到Debug以查看我的意思。