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
相关产品推荐
相关产品推荐

