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

ASP.NET Core应用登录成功后获取Azure ID Token及signinodc API响应中UserId Token的方法

我来帮你梳理下这两个问题的解决方案,结合你已经写好的身份认证代码来调整:

一、获取signin-oidc响应中的ID Token(你提到的UserId Token)

signin-oidc是OpenID Connect的回调端点,Azure AD在用户登录成功后会把ID Token等信息通过这个端点返回给你的应用。有两种方式可以获取到它:

1. 在回调过程中拦截获取

你可以通过配置OpenIdConnect的事件,在Token处理的不同阶段捕获ID Token。修改你现有的AddAuthentication代码,添加事件配置即可:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"), options =>
    {
        options.Events = new OpenIdConnectEvents
        {
            // 在授权码接收阶段直接获取原始ID Token
            OnAuthorizationCodeReceived = async context =>
            {
                var rawIdToken = context.ProtocolMessage.IdToken;
                // 如果你需要解析Token里的用户信息,比如用户ID,可以用JWT处理器
                var jwtHandler = new JwtSecurityTokenHandler();
                var parsedToken = jwtHandler.ReadJwtToken(rawIdToken);
                var userId = parsedToken.Claims.First(c => c.Type == "oid").Value;
                
                // 这里可以把Token或用户ID存到HttpContext.Items、缓存或数据库里
                context.HttpContext.Items["RawIdToken"] = rawIdToken;
                
                await Task.CompletedTask;
            },
            // 或者在Token验证通过后获取(此时Token已被系统解析)
            OnTokenValidated = context =>
            {
                var jwtToken = context.SecurityToken as JwtSecurityToken;
                if (jwtToken != null)
                {
                    var rawToken = jwtToken.RawData;
                    // 同样可以提取用户ID等声明
                    var userId = jwtToken.Claims.First(c => c.Type == "sub").Value;
                }
                return Task.CompletedTask;
            }
        };
    });

2. 登录成功后在业务代码中获取

登录完成后,ASP.NET Core会把ID Token存储在认证会话的属性中,你可以在任意Controller或者Razor页面里,通过HttpContext.GetTokenAsync方法直接获取:

public async Task<IActionResult> Dashboard()
{
    // 指定认证方案和Token类型("id_token"就是我们要的Azure ID Token)
    var idToken = await HttpContext.GetTokenAsync(OpenIdConnectDefaults.AuthenticationScheme, "id_token");
    
    if (!string.IsNullOrEmpty(idToken))
    {
        // 这里可以使用这个Token,比如传递给下游服务、做日志记录等
    }
    
    return View();
}
二、登录成功后获取Azure ID Token

其实这个需求和上面的场景完全一致——Azure AD在用户登录成功后返回的ID Token,就是你要找的Azure ID Token。补充几个注意点:

  • 你的Azure AD应用注册默认已经启用了ID Token颁发(用于OpenID Connect登录),不需要额外配置
  • 如果后续需要获取**访问令牌(AccessToken)**来调用Azure AD保护的API,才需要在代码里添加权限范围配置,但你的问题是ID Token,所以当前代码已经满足基础需求
  • 如果你需要持久化Token或者更灵活地管理令牌,可以使用Microsoft Identity Web提供的ITokenAcquisition服务,但对于直接获取ID Token来说,GetTokenAsync已经足够简单直接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:32:29