如何从 C# 控制器重定向到 URL(带有自定义标头)

Posted

技术标签:

【中文标题】如何从 C# 控制器重定向到 URL(带有自定义标头)【英文标题】:How to redirect to URL (with custom headers) from C# Controller 【发布时间】:2019-09-02 09:42:31 【问题描述】:

我需要将用户的浏览器重定向到我的 .NET Core C# 控制器操作中的新 URL,并使用 JWT 令牌添加我自己的自定义请求标头。

这可能吗?最好的方法是什么?

其他网站建议Response.Redirect("http://www.whatever.com")Server.Transfer("http://www.whatever.com")。前者重定向,但我无法让标题工作。后者我根本无法上班。 Server 需要 System.Web.HttpContext,它已从 .NET Core 中删除。

[HttpPost]
public void RedirectWithHeaders(string token)

    var payload = decodeJwtFromString(token);
    var jwt = makeNewJwt(payload);

    // Now go to the URL with an authorization header

此控制器操作需要接受已发布的字符串(该部分工作正常),然后重定向或以其他方式导航到添加了授权标头(由剖析的已发布字符串制成)的新页面。

【问题讨论】:

您不能使浏览器重定向到带有任何新的或更改的标头的 URL。您是否正在重定向到同一域中的 URL? 是的,在同一个域中。 【参考方案1】:

在 Startup.cs 中添加 IActionContextAccessor

 services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

将其注入您的控制器并创建新的 RedirectResult :

public class HomeController : Controller
   
    private readonly ILogger<HomeController> _logger;
    private readonly IActionContextAccessor _accessor;

    public HomeController(ILogger<HomeController> logger, IActionContextAccessor accessor)
    
        _logger = logger;
        _accessor = accessor;
    

    public IActionResult RedirectTo()
    
        // Create RedirectResult and add URLHelper 
        var result = new RedirectResult("www.google.com",true);
        result.UrlHelper = new UrlHelper(_accessor.ActionContext); 

        result.UrlHelper
              .ActionContext
              .HttpContext
              .Response.Redirect("www.google.com");

         result.UrlHelper
               .ActionContext
               .HttpContext
               .Response.Headers.Add("Just-Token", new StringValues("JustToken"));
        return result; 
    


使用 curl -i cmd 响应:

curl -i localhost:5000/Home/redirectTo
    HTTP/1.1 301 Moved Permanently
    Date: Thu, 02 Apr 2020 13:09:52 GMT
    Server: Kestrel
    Content-Length: 0
    Location: google.com
    Just-Token: JustToken

【讨论】:

我过早地否决了这个答案。我不断被重定向到我自己的域,例如“localhost:1234/Home/redirectTo/www.google.com”。我做了这个修改并且成功了:var result = new RedirectResult("https://www.google.com", true") 我刚刚使用它来添加 Header 以重定向 .. 而不仅仅是重定向 . 工作得很好! 在我看来,插入一个新的服务似乎非常笨拙,而且对于这个巨大的.ActionContent.HttpContext.Response.Headers.Add 东西来说相当尴尬。不可否认,它有效。然而,当事情变得如此复杂时,这通常表明我们正在反对这项技术,而不是使用它。我不会以任何方式质疑你的技能,伙计。只是好奇是否有更简单的方法。通常,MS 以某种方式构建 .NET,以便使常见任务变得容易。这在某种程度上是一项常见的任务。将其称为 easy 需要在解释该术语时具有很大的灵活性,但... 我在玩你的样本时也注意到了一件意想不到的事情。虽然包含标头,但只是应该包含的部分,会改变重定向的目标和永久状态的部分不受影响。如果我在创建对象时使用 url1false" 然后尝试使用注入的将其更改为 *url1 和/或 true服务,执行的调用仍然指向原来设置的地址。

以上是关于如何从 C# 控制器重定向到 URL(带有自定义标头)的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp 内部从控制器重定向到另一个控制器

如何使用命名 URL 映射从控制器重定向?

登录后 Spring MVC 控制器重定向到某个 URL

在 ASP.NET MVC 中使用 AJAX 方法时使用 C# 控制器重定向到页面

如何使用 $.get() 检测服务器重定向

使用“RedirectToAction”从控制器重定向到哈希