Blazor Server(.NET 7)多API调用的一次性用户授权方案咨询
解决Blazor Server中一次性获取多API授权的问题
增量授权错误的核心原因是初始登录时只请求了部分API的权限,后续调用其他API时需要动态请求权限触发的。要实现一次性获取所有授权,需从登录时的权限范围配置入手,确保所有需要的权限在初始阶段就被请求。
具体实现步骤
1. 统一配置初始登录的权限范围
在AddMicrosoftIdentityWebApp的配置中,通过WithOpenIdConnectOptions将所有API(包括Microsoft Graph和自定义下游API)的权限范围一次性添加到Scope集合中,让用户在首次登录时就完成所有权限的授权。
示例代码如下:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { config.Bind("AzureAd", options); // 添加Microsoft Graph所需权限 options.Scope.Add("User.Read"); options.Scope.Add("Mail.Read"); // 替换为你实际需要的Graph权限 // 添加自定义下游API的权限 options.Scope.Add("api://your-delegated-api-id/access_as_user"); options.Scope.Add("api://your-another-api-id/user.access"); // 必须添加offline_access以获取刷新令牌,避免频繁重新授权 options.Scope.Add("offline_access"); }) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(config.GetSection("MicrosoftGraph")) .AddDownstreamApi("DelegatedAPI", config.GetSection("AP1")) .AddDownstreamApi("AnotherAPI", config.GetSection("AP2"));
2. 同步下游API的配置
在appsettings.json中配置下游API时,确保每个API的Scopes与初始登录时添加的范围完全一致,这样令牌获取逻辑会直接使用初始登录时获取的包含所有权限的令牌,不会触发动态增量请求。
示例配置片段:
"AP1": { "BaseUrl": "https://your-api-1-domain.com", "Scopes": "api://your-delegated-api-id/access_as_user" }, "AP2": { "BaseUrl": "https://your-api-2-domain.com", "Scopes": "api://your-another-api-id/user.access" }
3. 验证Azure AD应用注册配置
- 确保Azure AD应用注册中已添加所有上述权限(包括Microsoft Graph和自定义API的权限)。
- 如果是企业租户应用,需确保管理员已对这些权限进行批量同意,避免用户每次登录都需单独授权。
关键注意点
- 所有需要的权限必须在初始登录时一次性请求,不能拆分到后续API调用时动态请求,否则仍会出现增量授权提示。
offline_access权限是必需的,它允许应用获取刷新令牌,在令牌过期时自动刷新,无需用户重新登录。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

