使用授权头重定向到操作

3
我有一个简单的“gate”方法,用于确定用户的jwt令牌是否有效,然后将其重定向到某个操作。我有两个需要授权的终点:
1. 其中一个仅用于确定令牌是否正确(如果不正确则返回401,否则返回OK); 2. 另一个是需要有效令牌的受保护区域。
我的问题是第一个终点返回令牌为OK,但第二个返回401。这是因为“解决方法”是:返回视图而不是操作。我意识到我忘了Authorization头,但如何添加头以重定向到操作呢?重定向到操作比View更重要,因为使用View时浏览器显示的旧URL是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。 https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guidehttps://learn.microsoft.com/en-us/aspnet/core/security/authorization/iauthorizationpolicyprovider?view=aspnetcore-2.1 - alsami
@alsami 嗯,我知道这不是最好的解决方案,但我没有其他想法,但实际上会有什么问题呢? - UbuntuCore
你应该使用中间件来处理这个问题,而不是在动作之间进行内部路由。 - alsami
1个回答

2
感谢Jean-François Fabre删除我的评论。
有时,未解决的帖子中的旧评论有助于重新激起辩论。
对于那些感兴趣的人,请按照答案进行操作。
在Startup.cs(Configure)中添加以下代码:
    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");

抱抱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接