我有两个应用程序-
- 公共客户端应用程序(.NET Core控制台应用程序(,用户在其中获得Microsoft身份访问令牌
- web API,它尝试使用该访问令牌代表用户调用Microsoft Graph
当我从web API调用Microsoft Graph时,我会得到一个MicrosoftIdentityWebChallengeUserException,内部异常状态为:"用户或管理员未同意使用ID为<…的应用程序>命名为<gt;。为此用户和资源发送交互式授权请求">
我试过:
- 到使用在Azure门户中暴露API选项卡在服务应用程序中预授权客户端应用程序
- 在"清单"选项卡中的knownClientApplications数组中添加客户端应用程序ID
- 在用户获得的访问令牌中包括Microsoft Graph所需的作用域(例如"User.Read"(
但这似乎不起作用,我仍然得到同样的异常。
问题是-在调用GRPC服务之前,我可以通过在用户访问令牌中获得所有所需的权限来避免这种异常情况吗?如果不能,我需要如何处理这种异常以将其传播回用户。
此处提供完整的详细信息。继续执行以下步骤。
基本上,你需要:
包括Microsoft。身份Web和Microsoft。身份网状物API项目中的MicrosoftGraph NuGet软件包。
在Azure应用程序注册中设置客户端机密或证书。将其包含在您的appsettings.json文件中:
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "{YOUR-DOMAIN-NAME-FROM-APP-REGISTRATION}",
"TenantId": "{YOUR-TENANT-ID-FROM-APP-REGISTRATION}",
"ClientId": "{YOUR-CLIENT-ID-FROM-APP-REGISTRATION}",
"Scopes": "{YOUR-API-ACCESS-SCOPE-FROM-APP-REGISTRATION}",
"CallbackPath": "/signin-oidc",
"ClientSecret": "{YOUR-CLIENT-SECRET-FROM-APP-REGISTRATION}"
}
在您的appsettings.json文件中包括以下部分:
"Graph": {
"BaseUrl": "https://graph.microsoft.com/v1.0",
"Scopes": "User.Read"
}
在Project.cs文件或Startup.cs文件中包含以下代码(取决于您使用的.Net版本(:
Startup.cs:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection("Graph"))
.AddInMemoryTokenCaches();
项目.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(builder.Configuration.GetSection("Graph"))
.AddInMemoryTokenCaches();
从那里,您只需要将GraphServiceClient注入控制器或页面构造函数中。上面的链接提供了在ASP中实现的代码。NET API。我在Blazor Webassembly托管的应用程序中使用此方法,因此我的实现需求与说明略有不同,但它正在正常运行/工作。