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

.NET 4.5调用Graph做身份认证加声明时account为空如何配置GraphClient

问题原因
  • 你每次在事件里新建IConfidentialClientApplication实例,该实例的token缓存为空,此时还没有用户的账户信息存入到这个新实例的缓存中,自然无法通过GetAccountAsync拿到数据
  • 异步上下文下ClaimsPrincipal.Current无法正确获取当前登录用户的标识,也会导致获取的账户ID错误

不要在SecurityTokenValidated事件中依赖新建MSAL实例的缓存,该阶段还未完成用户登录状态的缓存写入

修复后的实现代码
SecurityTokenValidated = async (x) =>
{
    IConfidentialClientApplication clientApp2 = MsalAppBuilder.BuildConfidentialClientApplication();
    AuthenticationResult result2 = null;
    string[] scopes = { "User.Read" };
    // 直接使用当前事件上下文中的授权码获取token,不需要先读取缓存账户
    result2 = await clientApp2.AcquireTokenByAuthorizationCode(scopes, x.ProtocolMessage.Code)
        .ExecuteAsync()
        .ConfigureAwait(false);
    
    var graphClient = new GraphServiceClient(
        new DelegateAuthenticationProvider(async (request) =>
        {
            var token = result2.AccessToken;
            request.Headers.Authorization = 
                new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
        })
    );
    var user = await graphClient.Me.Request()
        .Select(u => new
        {
            u.DisplayName,
            u.Mail,
            u.UserPrincipalName
        })
        .GetAsync();
    var identity = x.AuthenticationTicket.Identity;
    identity.AddClaim(new Claim(System.Security.Claims.ClaimTypes.Role, "test"));
}
注意事项
  • 确保MsalAppBuilder.BuildConfidentialClientApplication()方法中配置的客户端ID、客户端密钥、重定向URI、租户ID与你Azure AD注册的应用配置完全一致
  • 如果需要后续复用用户token,可在拿到result2之后,将账户信息存入全局共享的MSAL缓存中,后续其他业务场景就可以直接调用AcquireTokenSilent读取缓存token

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 15:06:03