使用授权标头重定向到操作

Posted

技术标签:

【中文标题】使用授权标头重定向到操作【英文标题】:Redirect to action with Authorization Header 【发布时间】:2019-02-12 12:05:22 【问题描述】:

我有简单的“门”方法,可以确定用户的 jwt 令牌是否有效,然后将他重定向到某些操作

我有两个端点需要授权,

其中一个仅用于确定令牌是否正常(如果不是则返回 401,否则返回 OK)

第二个是需要有效令牌的保护区

我的问题是第一个端点返回该令牌是好的,但第二个返回 401

因为“解决方法”是:返回视图而不是操作

我意识到我忘记了授权标头,但是

如何添加标题以重定向到操作?

return redirect to action 而不是 View 很重要,因为 View 浏览器会显示旧网址,在这种情况下是 localhost/Gate 而不是 localhost/Authorized

public async Task<IActionResult> Gate()

    var token = ExtractToken();

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer token");
    var get = client.GetAsync($"https://localhost:12345/TokenValidator").Result;

    switch (get.StatusCode)
    
        case HttpStatusCode.Unauthorized:
            return RedirectToAction("Unauthorized");
        case HttpStatusCode.OK:
            return RedirectToAction("Authorized"); // it enters this case
        default:
            return RedirectToAction("Index");
    


[Route("TokenValidator")]
[Authorize]
public IActionResult TokenValidator()

    return new OkObjectResult("OK");


[Route("Authorized")]
[Authorize]
public IActionResult Authorized()

    return View();

【问题讨论】:

这是非常糟糕的做法。请编写一个自定义的授权处理程序,或者更好地使用 JWT 的内置。 developer.okta.com/blog/2018/03/23/…docs.microsoft.com/en-us/aspnet/core/security/authorization/… @alsami 好吧,我知道这不是最好的解决方案,但我没有其他想法,但实际上会出现什么问题? 您应该为此使用中间件,而不是从一个动作到另一个动作进行内部路由。 【参考方案1】:

感谢 Jean-François Fabre 删除我的评论。

有时,未解决的帖子中的旧评论有助于恢复辩论。

有兴趣的可以关注回答。

在 Startup.cs 中(配置) 添加代码:

    app.UseSession();
    app.Use(async (context, next) =>
    
        var JWToken = context.Session.GetString("JWToken");
        if (!string.IsNullOrEmpty(JWToken))
        
            context.Request.Headers.Add("Authorization", "Bearer " + JWToken);
        
        await next();
    );

在 View 中,令牌验证后:

HttpContext.Session.SetString("JWToken", post.AccessToken);

然后就可以正常进行了。

我使用 RedirectToAction:

return RedirectToAction(actionName: "Default", controllerName: "Usuario");

拥抱

【讨论】:

以上是关于使用授权标头重定向到操作的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:使用 res.writeHead 的重定向缺少标头授权

重定向的瓶子设置授权标头

OkHttp是否在重定向上发送授权和其他可能敏感的标头?

Spring Security OAuth2 始终重定向到具有有效 Bearer 标头的 /login 页面

Apache NiFi的InvokeHTTP和其他HTTP处理器是否会向重定向的URL发送授权标头?

从角度 4.3+ 中的 302(重定向)响应中检索标头