如何从 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 需要在解释该术语时具有很大的灵活性,但...
我在玩你的样本时也注意到了一件意想不到的事情。虽然包含标头,但只是应该包含的部分,会改变重定向的目标和永久状态的部分不受影响。如果我在创建对象时使用 url1 和 false" 然后尝试使用注入的将其更改为 *url1 和/或 true服务,执行的调用仍然指向原来设置的地址。以上是关于如何从 C# 控制器重定向到 URL(带有自定义标头)的主要内容,如果未能解决你的问题,请参考以下文章