【发布时间】: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 好吧,我知道这不是最好的解决方案,但我没有其他想法,但实际上会出现什么问题?
-
您应该为此使用中间件,而不是从一个动作到另一个动作进行内部路由。
标签: c# asp.net-core asp.net-core-mvc jwt