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

