我有一个简单的“ gate”方法,该方法确定用户的jwt令牌是否有效,然后将其重定向到某个动作
我有两个需要授权的端点,
其中之一仅用于确定令牌是否正确(如果不正确,则返回401,否则返回401)
第二个是需要有效令牌的保护区
我的问题是,第一个端点返回该令牌正常,但第二个返回401
由于“解决方法”,即:返回View而不是操作
我意识到我忘记了Authorization标头,但是
如何添加标题以重定向到操作?
使用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();
}
答案 0 :(得分: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");
拥抱