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

如何在C#中获取AzureAD返回的id_token并解密?

解决Azure AD id_token在C#中无法获取的问题

我来帮你梳理下可能的问题点和对应的解决办法:

1. 先搞清楚id_token的实际传输位置

你在浏览器开发者工具里能看到id_token,但它大概率不会直接以id_token为键存在Request Headers或Form中。常见的传输方式有两种:

  • 放在Authorization请求头里,格式是 Bearer {你的token内容}
  • 存在Cookie中,键名通常是和身份认证相关的自定义名称(比如Azure AD相关的cookie可能带AzureAD前缀)

你可以打开浏览器开发者工具的「Network」标签,重新触发一次请求,查看请求的Headers或Cookies面板,确认token的具体位置。

2. 对应场景的正确获取代码

场景一:token在Authorization头中

var authHeader = Request.Headers["Authorization"].ToString();
if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer "))
{
    // 提取出纯token字符串
    var token = authHeader.Substring("Bearer ".Length).Trim();
    // 初始化JWT token
    JwtSecurityToken jwtToken = new JwtSecurityToken(token);
    // 后续处理逻辑
}

场景二:token在Cookie中

// 替换成你实际找到的Cookie键名
var tokenCookie = Request.Cookies["AzureAD.Identity.Token"];
if (!string.IsNullOrEmpty(tokenCookie))
{
    JwtSecurityToken jwtToken = new JwtSecurityToken(tokenCookie);
    // 后续处理逻辑
}

场景三:前端通过请求体传递token

如果是前端把token放在JSON或FormData的id_token字段里,需要读取请求体解析:

using (var reader = new StreamReader(Request.Body))
{
    var bodyContent = await reader.ReadToEndAsync();
    // 用JSON序列化工具解析,这里用System.Text.Json举例
    var payload = JsonSerializer.Deserialize<Dictionary<string, string>>(bodyContent);
    if (payload != null && payload.TryGetValue("id_token", out var token))
    {
        JwtSecurityToken jwtToken = new JwtSecurityToken(token);
        // 后续处理逻辑
    }
}

3. 额外注意事项

  • 一定要先做空值判断:如果token本身不存在或格式不对,直接初始化JwtSecurityToken会报错
  • 处理Azure AD的token更推荐用官方库:使用Microsoft.IdentityModel.Protocols.OpenIdConnect可以自动完成签名验证、过期检查等安全操作,示例代码如下:
using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;

var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
    "https://login.microsoftonline.com/{你的租户ID}/v2.0/.well-known/openid-configuration",
    new OpenIdConnectConfigurationRetriever());
var config = await configurationManager.GetConfigurationAsync(CancellationToken.None);

var tokenHandler = new JwtSecurityTokenHandler();
var validationParams = new TokenValidationParameters
{
    ValidAudience = "你的应用客户端ID",
    ValidIssuer = config.Issuer,
    IssuerSigningKeys = config.SigningKeys
};

SecurityToken validatedToken;
var claimsPrincipal = tokenHandler.ValidateToken(token, validationParams, out validatedToken);
var jwtToken = validatedToken as JwtSecurityToken;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:53:36