访问ADFS服务器OpenID UserInfo端点时遭遇401未授权问题
解决ADFS UserInfo端点401未授权(令牌未找到)问题
从你提供的日志和代码来看,核心问题是ADFS服务器没有接收到你通过WebClient添加的Authorization请求头——日志里明确提示无法在请求中找到访问令牌,错误描述也说明令牌需要放在Authorization头或表单参数里。下面是具体的排查和解决建议:
先确认
WebClient是否真的发送了Authorization头WebClient是比较老旧的.NET API,偶尔会出现请求头未正确发送的情况。你可以通过两种方式验证:- 使用Fiddler/WireShark抓包,查看实际发送的请求头中是否包含
Authorization: Bearer {你的令牌} - 临时修改代码,在发送请求前输出Headers集合,确认Authorization头已被添加:
foreach (string key in client.Headers.AllKeys) { Console.WriteLine($"{key}: {client.Headers[key]}"); }
- 使用Fiddler/WireShark抓包,查看实际发送的请求头中是否包含
替换为
HttpClient(推荐方案)HttpClient是.NET官方推荐的HTTP客户端,行为更稳定,更不容易出现头丢失的问题。替换后的代码示例:using System.Net.Http.Headers; string userInfoURL = "https://[base-server-url]/userinfo"; var client = new HttpClient(); // 正确设置Authorization头 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); try { string response = await client.GetStringAsync(userInfoURL); // 处理响应数据 } catch (HttpRequestException ex) { // 捕获异常用于排查 Console.WriteLine($"请求失败: {ex.Message}"); }检查令牌格式是否正确
确保accessToken变量没有多余的空格、换行或特殊字符,拼接后的"Bearer " + accessToken必须严格符合格式:Bearer后面跟一个半角空格- 令牌本身是完整的、未被截断的JWT字符串
排除ADFS端点配置冲突
日志中显示请求的查询字符串里带有access_token参数,这可能是你之前测试留下的痕迹?确保当前代码的请求没有同时携带查询参数和Authorization头,避免ADFS处理逻辑冲突。
另外,你的ADFS服务器版本(2016及以上)默认支持通过Authorization头传递令牌,且你已经正确配置了openid权限,所以配置层面的问题概率较低,重点排查请求发送环节即可。
内容的提问来源于stack exchange,提问作者Sachin Jose
相关产品推荐
相关产品推荐

