使用Azure AD B2C示例代码时TokenResponse反序列化遇'<'错误求助
这个问题我碰到过好几个开发者遇到,核心原因其实很直观:AcquireTokenByAuthorizationCodeAsync调用令牌端点时,收到的不是预期的JSON格式TokenResponse,而是HTML内容(异常里提到的意外字符'<'就是HTML标签的起始)——这说明Azure AD B2C返回了错误页面,而不是合法的令牌响应。
下面是一步步的排查和修复方案:
1. 先确认授权码和回调URL的一致性
- 授权码是一次性的,如果你不小心重复使用了同一个授权码,B2C会返回错误页面,直接导致反序列化失败。检查你的代码里有没有多次调用
AcquireTokenByAuthorizationCodeAsync使用同一个授权码的情况。 - 重点检查回调URL:Azure B2C应用注册里配置的
重定向URI必须和你代码里RedirectUri的配置完全一致,包括HTTP/HTTPS、端口、路径,甚至末尾的斜杠都不能差。比如代码里是http://localhost:5000/signin-oidc,但B2C里注册的是https://localhost:5000/signin-oidc,这种细微差别就会触发错误页面返回。
2. 核对ConfidentialClientApplication的核心配置
确保初始化ConfidentialClientApplication时的参数没有错误:
ClientId:必须和B2C应用注册里的客户端ID完全匹配,不能有拼写错误。ClientSecret(或证书):如果用的是客户端密钥,确认密钥没有过期,并且复制的是完整的密钥值(不是密钥ID);如果用证书,确保证书的指纹和B2C里配置的一致。Authority:格式必须正确,比如用户流的Authority应该是https://{你的租户名}.b2clogin.com/{你的租户名}.onmicrosoft.com/{你的用户流ID},比如https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin,不要漏了用户流部分。
3. 开启MSAL日志查看具体错误内容
要知道B2C到底返回了什么错误HTML,最直接的方式是开启MSAL的详细日志:
// 在初始化ConfidentialClientApplication时添加日志配置 var loggerFactory = new LoggerFactory(); loggerFactory.AddConsole(LogLevel.Debug); var confidentialClient = ConfidentialClientApplicationBuilder .Create(yourClientId) .WithClientSecret(yourClientSecret) .WithAuthority(yourAuthority) .WithRedirectUri(yourRedirectUri) .WithLoggerFactory(loggerFactory) .Build();
运行代码后,查看控制台日志里的响应内容,通常能找到具体的错误代码(比如invalid_client、redirect_uri_mismatch),这些错误会被B2C包装成HTML页面返回,直接导致反序列化失败。
4. 检查用户流/自定义策略的配置
- 如果使用的是自定义策略,确保策略里的OAuth2技术配置正确,令牌端点的URL没有写错,并且策略没有配置错误导致返回错误页面。
- 确认你的用户流没有被禁用,租户状态正常(比如没有欠费或被限制)。
常见的修复案例
- 之前有开发者把
RedirectUri配置成了HTTP,但B2C里注册的是HTTPS,导致返回400错误的HTML; - 还有用户复制ClientSecret时只复制了部分内容,导致
invalid_client错误,触发HTML返回; - 授权码被重复使用,也会触发这个异常。
总的来说,这个异常的本质是令牌请求没有得到合法的JSON响应,而是错误页面,所以通过日志定位具体错误、核对配置一致性是最快的解决路径。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

