GraphServiceClient结合Microsoft Identity Web在Razor Page中调用失败如何解决
问题修复方案
1. 修正Razor Page异步方法返回值
你当前IndexModel的OnGet方法使用了async void声明,这是导致报错的核心原因:ASP.NET Core中Razor Page的请求处理方法不允许使用async void,会导致请求上下文提前释放,注入的GraphServiceClient无法获取当前登录用户的身份信息,进而无法静默获取调用Graph所需的令牌。
直接将方法声明修改为:
public async Task OnGetAsync()
方法内部逻辑无需调整。
2. 修正权限Scope配置
你当前使用的https://graph.microsoft.com/.default是应用级权限的Scope,而你调用的/me接口属于用户委托权限,需要调整两处配置:
- 修改appsettings.json中DownstreamApi的Scopes值:
"DownstreamApi": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "User.Read" } - 修改IndexModel上的
AuthorizeForScopes特性配置:[AuthorizeForScopes(Scopes = new[] { "User.Read" })] public class IndexModel : PageModel
为什么Startup中的调用可以正常执行
你在OnTokenValidated事件中是直接使用回调返回的访问令牌手动构造了GraphServiceClient,没有走依赖注入客户端的令牌获取逻辑,不受上下文丢失的影响,因此可以正常调用接口。
内容的提问来源于stack exchange,提问作者OjM
相关产品推荐
相关产品推荐

