我正在使用基本API控制器的RedirectToAction方法。第一个控制器需要修改请求标头(我似乎可以做到),但更改不会保留。
这是我要执行的操作的简化实现。
[HttpGet]
public IActionResult Get(string str)
{
// The request comes with a request header with key "Authorization" and value "ABC"
HttpContext.Request.Headers.Remove("Authorization");
HttpContext.Request.Headers.Add("Authorization", "XYZ");
return RedirectToAction("B");
}
[HttpGet]
public IActionResult B()
{
var value = HttpContext.Request.Headers.First(x => x.Key == "Authorization"); // I want this to be ""XYZ" , but it remains "ABC"
return Ok();
}
关于如何获取第二个动作以使用在第一个动作中更新的Request标头的任何想法。
编辑:
我们所有的控制器/动作均使用核心中间件JWT Auth策略进行了身份验证 只有动作一允许匿名访问。 从内部相关解决方案中使用“代码”调用操作一(用于创建JWT令牌)。 所有其他操作都需要JWT进行身份验证。
“代码”和JWT令牌具有独立的到期时间,并且还保存一些数据。
“代码”中的信息被认为是最新的。可以使用“代码”和JWT令牌调用操作一。
重定向是我清除旧JWT令牌的方式。
使用有效的“代码”调用操作一时,将创建一个新的JWT。然后,我想重定向到将验证JWT令牌的控制器(使用中间件)。
我知道我可以手动执行此操作,但是尝试触发核心中间件。
答案 0 :(得分:0)
RedirectToAction
向浏览器返回302
响应,该响应告诉浏览器对新URL发起新请求。因此,浏览器发起了一个全新的请求后,您在B()
中的代码就会被命中。因此,您在Request
中查看的B()
对象与您在Get()
中修改的对象完全不同。
这显然不是您想要执行的操作。无需重定向,只需返回B():
[HttpGet]
public IActionResult Get(string str)
{
// The request comes with a request header with key "Authorization" and value "ABC"
HttpContext.Request.Headers.Remove("Authorization");
HttpContext.Request.Headers.Add("Authorization", "XYZ");
return B();
}
但是重写请求标头确实有些不对劲。有点像重写历史。另一种方法是使用HttpContext.Items
存储值:
[HttpGet]
public IActionResult Get(string str)
{
HttpContext.Items["Authorization"] = "XYZ";
return B();
}
[HttpGet]
public IActionResult B()
{
var value = HttpContext.Items["Authorization"] as string ?? HttpContext.Request.Headers.First(x => x.Key == "Authorization");
return Ok();
}
HttpContext.Items
中的值在单个请求的生命周期内一直存在。
如果必须重定向,则可以使用TempData
保留数据,直到在下一个请求中读取该数据为止:
[HttpGet]
public IActionResult Get(string str)
{
TempData["Authorization"] = "XYZ";
return RedirectToAction("B");
}
[HttpGet]
public IActionResult B()
{
if (TempData.Contains("Authorization")) {
HttpContext.Request.Headers.Remove("Authorization");
HttpContext.Request.Headers.Add("Authorization", TempData["Authorization"]);
}
var value = HttpContext.Request.Headers.First(x => x.Key == "Authorization");
return Ok();
}