繁体   English   中英

在 .NET 7 MAUI 中使用 JWT 认证消费 web api?

[英]Consuming web api with JWT authentication in .NET 7 MAUI?

我在外部 web 服务器上安装了最小的 API .NET 7 并使用 JWT 进行身份验证。 为了进行测试,我创建了一些端点(有和没有身份验证),因此我可以通过 Postman 测试 web API。我从我的私人机器启动 Postman 并访问 API 的 web 地址以测试所有内容。

现在一切都按预期工作。 我可以通过 Postman 登录,然后我得到 JWT,如果我在 Postman 中输入 JWT,那么我也可以访问受保护的端点并从 Web API 中获取数据。

现在我已经在 MAUI .NET 7 中创建了一个桌面应用程序,我想使用这个 web API。同样在这里,对未受保护的端点的访问以及接收 JWT 的登录都有效。只有整个事情的最后一部分不再起作用那就是通过交付 JWT 访问受保护的端点,为此我不断收到消息 401 Unauthorized。 如果我然后将相同的 JWT 放入 Postman,那么请求将通过 Posstman,我从 Web API 获取数据!

我一直在寻找解决方案并尝试了来自 inte.net 的所有可能的代码示例。 例如:

 var requestMessage = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri("http://api.mywebsite.com:64591/secret") }; requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Token.token); var response = await _httpClient.SendAsync(requestMessage);

或者

 _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", Token.token); var RawData = await _httpClient.GetStringAsync("http://api.mywebsite.com:64591/secret2");

在某些地方,我读到更改为 .NET 6 存在问题。解决方案是新的 NuGet 包,但由于我已经在 .NET 7 上,所以我安装了最新版本。

还有一个帖子建议在 web API 中将 issuer 和 audience 设置为 false。 我也这样做了,但没有成功。

 ValidateIssuer = false, ValidateAudience = false,

有没有人有消耗最少 API 的 MAUI 本机应用程序的工作代码?

编辑

按照Heretic Monkey的建议,我安装了Wireshark软件,分析了Network Transfer。

这是我发现的:

  • 身份验证后我从 Web Api 收到的令牌,我在向授权端点请求时也以相同的形式发送(因此从客户端接收和发送的令牌是相同的)。 我在这里的结论是令牌是正确的。
  • 当带有 JWT 的请求从客户端发送到服务器(Web Api)时,我收到错误消息 401。在日志中,我看到以下信息,原因是 Bearer error="invalid_token":
 Hypertext Transfer Protocol HTTP/1.1 401 Unauthorized\r\n [Expert Info (Chat/Sequence): HTTP/1.1 401 Unauthorized\r\n] [HTTP/1.1 401 Unauthorized\r\n] [Severity level: Chat] [Group: Sequence] Response Version: HTTP/1.1 Status Code: 401 [Status Code Description: Unauthorized] Response Phrase: Unauthorized Transfer Encoding: chunked\r\n Server: Microsoft-IIS/10.0\r\n WWW-Authenticate: Bearer error="invalid_token"\r\n X-Powered-By: ASP.NET\r\n Date: Sun, 18 Dec 2022 09:07:00 GMT\r\n \r\n [HTTP response 1/1] [Time since request: 0.047969000 seconds] [Request in frame: 790] [Request URI: http://api.myserver.com:64591/secret2] HTTP chunked response End of chunked encoding Chunk size: 0 octets \r\n File Data: 0 bytes

我能想到的错误原因只有两个:

  1. 我的最小 API(Web Api)中仍然有一个错误,这是关于我从客户端获得的 JWT 并且不知何故仍然需要转换/压接 JWT 吗?事实上,我可以使用 JWT 的形式发送给客户端。 那么它可能是错误的,这就是出现此错误消息“invalid_token”的原因。
  2. 第二个原因可能是.NET 7,所以发生错误不是因为我的代码有误,而是因为它在.NET 7 中实现不正确(当然不太可能,但并非不可能)。

也许有人建议我如何解决这个错误?

如果这不起作用(即通过 JWT 身份验证向 Web Api 发出的请求),那么 Web Api 在 .NET 7 中将无法使用,我真的无法想象。

所以我真的假设错误是在我的实现中(服务器/最小 Api 或客户端 MAUI.NET 7)。

谢谢

这个问题已经有点奇怪了,因为即使是 Internet 上提供的许多教程和帖子也无法正常工作。 但是如果你复制生成的令牌(例如从调试模式)并在 Postman 中使用它,那么一切都会很好地工作,这让你很困惑。 幸运的是,仍有人拥有不可思议的头脑,能够发现这种不一致之处。 我也不会在 1000 年内看到这个 :)

请参阅: https ://learn.microsoft.com/en-us/answers/questions/1133200/401-unauthorized-consuming-web-api-with-jwt-authen.html

在我的例子中,我注意到 .NET MAUI 中的 response.Content.ReadAsStringAsync().Result 将返回“+token+”,我已经修剪了引号 ("),它与我一起工作

使用 HttpResponseMessage response = await client.PostAsJsonAsync("Login", loginData);

    response.EnsureSuccessStatusCode();

    string token =   response.Content.ReadAsStringAsync().Result;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM