代码之家  ›  专栏  ›  技术社区  ›  GoldenAge

当外部API调用cookie时,操作不会创建cookie

  •  7
  • GoldenAge  · 技术社区  · 6 年前

    假设我们有如下代码:

    public class HomeController : Controller
    {
        [HttpPost]
        public IActionResult AdvanceTokenCallback(string apiToken)
        {
            Response.Cookies.Append("Token", apiToken, new Microsoft.AspNetCore.Http.CookieOptions()
            {
                Path = "/",
                Expires = _tokenCookieExpirationTime
            });
            return RedirectToAction(nameof(CreateWorkItem));
        }
    
        [HttpGet]
        public IActionResult CreateWorkItem()
        {
            string token = Request.Cookies["Token"];
            return View();
        }
    }
    

    当行动 AdvanceTokenCallback 从外部API调用 token 变量在 CreateWorkItem 行动变成了 null . 然而,在一个案例中,当我创建一个“桥接”动作并移动在那里创建cookie的逻辑时,然后 令牌 位于CreateWorkItem中,包含我所期望的值。

    public class HomeController : Controller
    {
        [HttpPost]
        public IActionResult AdvanceTokenCallback(string apiToken)
        {
            return RedirectToAction(nameof(BridgeRedirect), new { apiToken });
        }
    
        [HttpGet]
        public IActionResult BridgeRedirect(string apiToken)
        {
            Response.Cookies.Append("Token", apiToken, new Microsoft.AspNetCore.Http.CookieOptions()
            {
                Path = "/",
                Expires = _tokenCookieExpirationTime
            });
            return RedirectToAction(nameof(CreateWorkItem));
        }
    
        [HttpGet]
        public IActionResult CreateWorkItem()
        {
            string token = Request.Cookies["Token"];
            return View();
        }
    }
    

    知道为什么会这样吗?有没有可能避免额外的 BridgeRedirect 额外重定向操作?

    1 回复  |  直到 6 年前
        1
  •  4
  •   GoldenAge    6 年前

    我发现,当我在本地主机上运行应用程序时,代码在不同的机器和不同的环境中是有效的,而不是有效的。 在我设定了 IsEssential 当创建cookie时,属性为true,一切正常。 从Microsoft文档:

    Isessential-指示此cookie对于 应用程序正常工作。如果是真的,那么同意政策检查 可以绕过。默认值为假。

    所以在我的例子中,解决方案是创建一个这样的cookie:

    Response.Cookies.Append("Token", apiToken, new Microsoft.AspNetCore.Http.CookieOptions()
    {
        IsEssential = true,
        Expires = _tokenCookieExpirationTime
    });
    

    用这种方法我不需要额外的 BridgeRedirect 不再。