假设我们的代码如下:
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
操作?
答案 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
。