.NET Core 2.1 中的 HttpContext.GetTokenAsync 无法检索 JWT

Posted

技术标签:

【中文标题】.NET Core 2.1 中的 HttpContext.GetTokenAsync 无法检索 JWT【英文标题】:JWT cannot be retrieved by HttpContext.GetTokenAsync in .NET Core 2.1 【发布时间】:2019-03-18 12:13:17 【问题描述】:

这个真的让我摸不着头脑,因为我可以创建 JWT。我可以添加一个属性来授权控制器,看看我是否不向标头添加“授权”“承载(令牌)”,它将返回 401 未授权。但是,像获取令牌字符串以获取其有效负载声明这样简单的事情是行不通的。

所以这很好用:

var token = Request.Headers["Authorization"];

这不是:

var token2 = await HttpContext.GetTokenAsync(JwtBearerDefaults.AuthenticationScheme, "access_token");

我已经更改了签名,像这样在启动时连接了 IHTTPContextAccessor:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

我可以看到 IHttpContextAccessor 具有值以及授权密钥。我可以发誓这曾经在 .NET Core 2.0 中很容易工作,但现在不行了。我在启动或程序中缺少一个简单的连接吗?此时,我将只从 Request.Headers 中获取数据。但这只是感觉就像一个黑客。

【问题讨论】:

【参考方案1】:

这似乎是 ASP.NET Core 2.1 中的 known issue(在即将发布的 2.2 中修复)。我链接的关于 GitHub 问题的建议是从标题中提取值,就像您在问题中所做的那样。一旦 2.2 发布并且您可以升级,您应该可以恢复使用 HttpContext.GetTokenAsync

【讨论】:

是的,我查看了您提供的链接并尝试了 Haok 的冗长的东西,例如: (await _httpContextAccessor.HttpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme)).Ticket.Properties.GetTokenValue("access_token");即使在控制器和启动的 IOC 中连接了 HttpContextAccessor ,这仍然不起作用。很高兴不只是我做错了什么。这很奇怪,但当我偶然发现多个建议使用“HttpContext.GetTokenAsync”的网站时,他们破坏了类似的东西。我想我会坚持获取标题,谢谢。 Tratcher 确认 further down in the chain HaoK 的方法也不起作用,仅供参考。

以上是关于.NET Core 2.1 中的 HttpContext.GetTokenAsync 无法检索 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 net core 2.1+ / net 5 中的预编译视图进行调试?

Core 2.1 和 .net5 中的 Encoding.Default.GetString 不等于字符串,来自等于字节数组

从asp.net core 2.1中的控制器访问BackgroundService

需要帮助对 linux Docker 中的 .NET Core 2.1 API 进行故障排除

ASP.NET Core 2.1 中的 UseStaticFiles、UseSpaStaticFiles 和 UseSpa 有啥区别?

.NET Core 2.1 中的 HttpContext.GetTokenAsync 无法检索 JWT