Azure AD B2C报错:请求中的scope 'files.read'不受支持,如何解决?
问题描述
我为MAUI授权应用配置了Scope(配置截图见指定链接),但代码中设置如下:
public static readonly string[] Scopes = { "files.read", "files.write", }; if (IdentityClient == null) { IdentityClient = PublicClientApplicationBuilder .Create(Constants.ClientId) .WithAuthority(AzureCloudInstance.AzurePublic, "common") .WithB2CAuthority(Constants.AuthoritySignIn) .WithIosKeychainSecurityGroup("com.microsoft.adalcache") .WithRedirectUri($"msal{Constants.ClientId}://auth") .Build(); } var accounts = await IdentityClient.GetAccountsAsync(); AuthenticationResult result = null; bool tryInteractiveLogin = false; try { result = await IdentityClient .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault()) .ExecuteAsync(); }
调用时触发MSAL异常:
{"error":"invalid_request","error_description":"AADB2C90117: The scope 'files.read' provided in the request is not supported.\r\nCorrelation ID: 23bba783-6562-4111-b097-9282a48e04c6\r\nTimestamp: 2023-06-27 14:56:31Z\r\n"}
请问该异常出现的原因是什么,如何解决?
原因与解决方案
核心原因
- 你使用的是Azure AD B2C认证服务,但
files.read、files.write属于Microsoft Graph的API权限范围,AD B2C默认不支持直接请求第三方API的Scope,必须完成关联配置后才能使用。 - 代码中同时配置了
.WithAuthority(AzureCloudInstance.AzurePublic, "common")和.WithB2CAuthority(Constants.AuthoritySignIn),导致认证权限源冲突,AD B2C流程只能保留专属的权限源配置。
解决步骤
修正认证客户端配置
移除冲突的.WithAuthority配置,确保仅使用AD B2C权限源:IdentityClient = PublicClientApplicationBuilder .Create(Constants.ClientId) .WithB2CAuthority(Constants.AuthoritySignIn) .WithIosKeychainSecurityGroup("com.microsoft.adalcache") .WithRedirectUri($"msal{Constants.ClientId}://auth") .Build();完成AD B2C应用的API权限配置
- 登录Azure门户,进入你的AD B2C租户,找到目标MAUI应用的应用注册页面
- 进入API权限,点击添加权限,选择Microsoft Graph,添加
Files.Read、Files.Write委托权限 - 点击授予管理员同意(租户级应用需执行此操作)
- 确认配置的Scope名称与代码中完全一致(注意大小写和拼写)
使用完整Scope格式(推荐)
为避免歧义,建议使用Microsoft Graph Scope的完整格式:public static readonly string[] Scopes = { "https://graph.microsoft.com/files.read", "https://graph.microsoft.com/files.write" };补充静默登录失败的处理逻辑
当前代码未处理静默登录失败的情况,建议添加交互式登录 fallback:try { result = await IdentityClient .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault()) .ExecuteAsync(); } catch (MsalUiRequiredException) { // 静默登录失败,触发交互式登录 result = await IdentityClient .AcquireTokenInteractive(Constants.Scopes) .ExecuteAsync(); }
内容的提问来源于stack exchange,提问作者inno
相关产品推荐
相关产品推荐

