当外部API调用Action时,它不会创建cookie

时间:2019-01-29 17:51:58

标签: c# asp.net-core asp.net-core-mvc

假设我们的代码如下:

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();
    }
}

从外部API调用动作AdvanceTokenCallback时,token动作中的CreateWorkItem变量变为null。 但是,如果我创建一个“桥”动作并在其中移动创建cookie的逻辑,则位于CreateWorkItem中的token包含一个我期望的值。

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 个答案:

答案 0 :(得分:4)

当我在localhost上运行该应用程序时,我发现代码在不同的机器和不同的环境下都可以正常工作。 在创建Cookie时,将IsEssential属性设置为true后,一切正常。 从Microsoft文档中:

  

IsEsssential-指示此cookie是否对   应用程序正常运行。如果为true,则同意策略检查   可能会被绕过。默认值为false。

所以我的解决方案是只创建一个如下的cookie:

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

使用这种方式,我不再需要多余的BridgeRedirect