【发布时间】:2021-09-15 23:11:33
【问题描述】:
我正在使用基本 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();
}
关于如何让第二个操作使用我在第一个操作中更新的请求标头的任何想法。
编辑:
我们所有的控制器/操作都使用核心中间件 JWT Auth Policy 进行身份验证 只有操作一允许匿名访问。 使用“代码”(用于创建 JWT 令牌)的内部相关解决方案调用操作一。 所有其他操作都需要 JWT 进行身份验证。
“代码”和 JWT Token 有独立的过期时间,也持有一些数据。
“代码”中的信息被认为是最新的。可以使用“代码”和 JWT 令牌调用操作一。
重定向是我清除旧 JWT 令牌的方式。
当使用有效的“代码”调用操作一时,会创建一个新的 JWT。然后我想重定向到一个将验证 JWT 令牌的控制器(使用中间件)。
我知道我可以手动执行此操作,但尝试触发核心中间件。
【问题讨论】:
-
你需要它改变响应头......不是请求头......
-
这不是我需要的。 Action B的response需要返回,但是第一个Action需要根据请求来的内容做一些修改。
-
这是不可能的。 HTTP 是一种无状态协议,因此,每个请求都是独立的。重定向只是返回带有
Location标头的 301、302 或 307。而已。请求-响应周期完成。由客户端决定,然后向Location标头中的 URL 发出新请求,而 Web 浏览器恰好会自动执行该请求。但是,这是一个全新的请求,它不知道也不关心是否发生了重定向,甚至不知道以前曾与此服务器进行过通信。
标签: c# asp.net-core