在RedirectToAction C#中传递请求上下文

时间:2019-07-25 13:12:23

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

我正在使用基本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令牌的控制器(使用中间件)。

我知道我可以手动执行此操作,但是尝试触发核心中间件。

1 个答案:

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