You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 API JWT授权失败求助:MAUI请求签名异常

解决MAUI请求JWT签名不一致导致的401未授权问题

针对你遇到的MAUI请求中JWT签名与存储/Postman不一致、API返回未授权的问题,按以下步骤排查解决:

1. 验证Preferences存储的Token完整性

MAUI的Preferences在存储字符串时可能因特殊字符或截断导致Token不完整,先确认取出的Token与生成的完全一致:

var token = Preferences.Default.Get("Token", "n/a");
// 输出完整Token到调试日志,对比Postman中可用的Token
System.Diagnostics.Debug.WriteLine($"取出的Token: {token}");

如果日志中的Token和Postman里的有差异(比如少了部分字符、出现转义符),检查存储Token的代码是否有误,确保存入的是GenerateJSONWebToken返回的完整字符串:

// 存储时直接存生成的完整Token
var newToken = GenerateJSONWebToken(email, userId);
Preferences.Default.Set("Token", newToken);

2. 修正RestSharp的Header添加方式

避免使用AddDefaultHeader可能带来的覆盖或编码问题,直接在请求实例中添加Authorization Header:

var token = Preferences.Default.Get("Token", "n/a");
var client = new RestClient(_settingsService.GetSettings().Result.APIURL);
var request = new RestRequest("mobile/myteams");
// 直接给当前请求添加Header
request.AddHeader("Authorization", $"Bearer {token}");
var response = client.Execute(request);

3. 确认API与Token生成的SecretKey完全一致

签名不一致最常见原因是验证端(API)和生成端的SecretKey不匹配:

  • 检查API的appsettings.json中JWTSettings:SecretKey的值,和生成Token时_jwt.Value.SecretKey的内容完全一致,注意大小写、空格、特殊字符(比如JSON中的转义符\)
  • 确保API和MAUI调用的是同一环境(开发/测试/生产),不同环境的配置可能不同

4. 排查Token传输中的编码问题

如果Token包含特殊字符,RestSharp可能自动对Header进行URL编码,导致签名部分被篡改。可以手动验证Header的原始内容:
用抓包工具(比如Charles、Fiddler)查看MAUI发出的请求中Authorization Header的实际值,对比Postman的请求Header,确认Bearer 后面的Token字符串完全一致。

5. 确认API认证策略配置

由于API同时启用了JWT和Cookie认证,需要确保[Authorize]特性指定了JWT认证方案,否则可能优先使用Cookie认证导致验证失败:
在API控制器或方法上添加指定方案的[Authorize]:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[ApiController]
[Route("mobile")]
public class MobileController : ControllerBase
{
    // 你的端点方法
}

内容的提问来源于stack exchange,提问作者Matthew Warr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:57:27