Project Online项目权限模式下应用仅身份验证绕MFA遇错求助
具体解决方案步骤
一、修正Azure AD应用权限配置
- 在Azure AD(Entra ID)注册应用后,切换到应用权限标签,添加以下权限(需管理员同意):
- SharePoint ->
Sites.FullControl.All(或Sites.Selected实现最小权限) - 注:Project相关的应用权限在Azure AD界面不直接显示,无需额外添加,依赖SharePoint权限结合PWA站点授权即可。
- SharePoint ->
二、在PWA站点授予应用专属权限
- 访问你的PWA站点权限配置页:
https://<tenant>.sharepoint.com/sites/<pwa-site>/_layouts/15/appinv.aspx - 输入Azure AD应用的Client ID,点击"Lookup"加载应用信息
- 输入以下权限请求XML(针对PWA站点的Project资源):
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/project" Right="FullControl" />
- 点击"Create"后,由PWA站点管理员完成权限批准。
三、修正CSOM代码的关键问题
你之前的代码存在两个核心问题:
- Scope指向错误:必须使用PWA站点的专属scope,而非根SharePoint站点
- ProjectContext初始化需指向PWA站点URL
修正后的代码示例:
public static void Login(this ProjectContext context) { var clientId = "你的Azure AD应用Client ID"; var tenantId = "你的租户ID"; var pwaSiteUrl = "https://<tenant>.sharepoint.com/sites/<pwa-site>"; var certificate = new X509Certificate2("c:\\temp\\cert.pfx", "证书密码"); var authority = $"https://login.microsoftonline.com/{tenantId}"; var scope = $"{pwaSiteUrl}/.default"; var app = ConfidentialClientApplicationBuilder.Create(clientId) .WithCertificate(certificate) .WithAuthority(new Uri(authority)) .Build(); AuthenticationResult result = Task.Run(() => app.AcquireTokenForClient(new[] { scope }).ExecuteAsync()).Result; string accessToken = result.AccessToken; context.ExecutingWebRequest += (sender, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = $"Bearer {accessToken}"; }; } // 初始化ProjectContext时必须指向PWA站点 var pwaContext = new ProjectContext(new Uri("https://<tenant>.sharepoint.com/sites/<pwa-site>")); pwaContext.Login(); pwaContext.Load(pwaContext.Projects); pwaContext.ExecuteQuery();
四、解决"用户未找到"错误
这个错误是因为Project Online的项目权限模式未识别Azure AD应用的身份,需确保:
- PWA站点的应用权限已成功批准(步骤二完成)
- 若使用最小权限,需在PWA的项目权限设置中,将应用权限映射到具体的项目组(如"Project Managers"),确保应用拥有对应项目的访问权限。
五、条件访问策略调整
若租户有强制MFA的条件访问策略,需为该Azure AD应用添加例外:
- 在Entra ID的条件访问策略中,排除该应用,或设置"应用类型"为"服务主体"时绕过MFA验证。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

