Azure App Service Easy Auth获取Microsoft Graph AccessToken失败排查
我来帮你捋一捋这个问题——这种情况我之前在项目里碰到过好几次,大概率是配置或者认证流程里的某个细节没到位,咱们一步步排查:
先确认
additionalLoginParams的配置是否正确
首先要注意,这个参数的配置位置和格式很关键:- 在Azure Portal中,你需要进入App Service的「Authentication」→「Azure Active Directory」→「Edit」,在「Additional login parameters」里单独添加一行
resource=https://graph.microsoft.com(注意不要带方括号,方括号只是示例中的数组格式,实际Portal里每行一个参数)。 - 如果用Azure CLI配置,命令应该是:
az webapp auth update --name <你的应用名> --resource-group <你的资源组> --additional-login-parameters "resource=https://graph.microsoft.com"
另外,务必使用
https://graph.microsoft.com(Microsoft Graph),不要用旧的https://graph.windows.net(Azure AD Graph,已被淘汰),否则获取的token无法用于新版Graph API。- 在Azure Portal中,你需要进入App Service的「Authentication」→「Azure Active Directory」→「Edit」,在「Additional login parameters」里单独添加一行
检查认证强制跳转设置
如果你的App Service Authentication设置的是「Allow anonymous requests (no action)」,那么用户访问应用时可能不会触发完整的AAD认证流程,自然也不会获取到Graph的Access Token。请确保设置为「Log in with Azure Active Directory」,这样所有未认证的请求都会被重定向到AAD完成认证,触发完整的授权流程。确认AAD应用注册的权限配置
你的App Service对应的AAD应用注册(就是Authentication里绑定的那个应用),必须添加Microsoft Graph的Delegated权限(比如User.Read、Mail.Read等),并且:- 如果是企业租户应用,需要管理员授予管理员同意;
- 如果是个人应用,用户第一次登录时需要手动同意这些权限。
没有配置对应权限的话,AAD不会返回Graph的Access Token,因为它不知道你的应用需要访问Graph资源。
检查Token Store和认证响应类型
在Azure Portal的Azure AD认证配置中,确保「Token store」是开启状态。另外,默认的认证请求可能只返回ID Token,你需要确保请求中包含response_type=code id_token token(至少包含token)——不过添加resource参数一般会触发AAD返回对应资源的Access Token,但如果响应类型里没有token,可能还是拿不到。排查
/.auth/me的返回内容
先确保你是在已登录的会话下访问/.auth/me(比如先访问应用主页触发登录),然后查看返回的JSON:- 正常情况下,应该会有
access_tokens数组,里面包含针对https://graph.microsoft.com的token信息; - 如果没有,去Azure AD的「Sign-ins」日志里查看对应的登录记录,检查是否有返回Access Token的记录,或者有没有权限相关的错误。
- 正常情况下,应该会有
服务端获取Token的注意事项
服务端用Request.Headers["x-ms-token-aad-access-token"]获取的token,默认可能是针对App Service自身的,而不是Graph的。如果遇到这种情况,你可以:- 使用App Service的
/.auth/refresh端点,指定resource=https://graph.microsoft.com来获取专门的Graph Token; - 改用Azure Identity库(替代旧的
Microsoft.Azure.Services.AppAuthentication),在服务端直接获取Graph Token,这种方式更可靠,也更符合微软的最新推荐。
- 使用App Service的
清除缓存重新登录
有时候旧的会话缓存了未包含Graph资源的Token,你可以尝试清除浏览器缓存、注销当前登录后重新登录,触发新的认证流程,让AAD重新返回包含Graph资源的Token。
内容的提问来源于stack exchange,提问作者Ringo

