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

访问ADFS服务器OpenID UserInfo端点时遭遇401未授权问题

解决ADFS UserInfo端点401未授权(令牌未找到)问题

从你提供的日志和代码来看,核心问题是ADFS服务器没有接收到你通过WebClient添加的Authorization请求头——日志里明确提示无法在请求中找到访问令牌,错误描述也说明令牌需要放在Authorization头或表单参数里。下面是具体的排查和解决建议:

  • 先确认WebClient是否真的发送了Authorization头
    WebClient是比较老旧的.NET API,偶尔会出现请求头未正确发送的情况。你可以通过两种方式验证:

    1. 使用Fiddler/WireShark抓包,查看实际发送的请求头中是否包含Authorization: Bearer {你的令牌}
    2. 临时修改代码,在发送请求前输出Headers集合,确认Authorization头已被添加:
      foreach (string key in client.Headers.AllKeys)
      {
          Console.WriteLine($"{key}: {client.Headers[key]}");
      }
      
  • 替换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:22:53