0

我有两个应用程序 -

  • 公共客户端应用程序(.NET Core 控制台应用程序),用户在其中获取 Microsoft 身份访问令牌
  • web API,它尝试使用该访问令牌代表用户调用 Microsoft Graph

当我从 Web API 调用 Microsoft Graph 时,我得到一个MicrosoftIdentityWebChallengeUserException,其内部异常状态为:“用户或管理员未同意使用 ID <...> 名为 <...> 的应用程序。发送交互式授权请求对于这个用户和资源。”

我试过了:

  • 使用在 Azure 门户中公开 API 选项卡对服务应用程序中的客户端应用程序进行预授权
  • 在 Manifest 选项卡的knownClientApplications数组中添加客户端应用程序 ID
  • 在用户获得的访问令牌中包含 Microsoft Graph 所需的范围(例如“User.Read”)

但似乎这不起作用,我仍然得到同样的例外。

问题是- 在调用 GRPC 服务之前,我是否可以通过在用户访问令牌中获取所有需要的权限来以某种方式避免这种异常情况,或者如果没有,我需要如何处理此异常以将其传播回用户。

4

1 回答 1

1

完整的细节在这里。继续执行后续步骤。

基本上,您需要:

在 API 项目中包含 Microsoft.Identity.Web 和 Microsoft.Identity.Web.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 版本):

启动.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 托管应用程序中使用此方法,因此我的实现需求与说明略有不同,但它按应有的方式运行/工作。

于 2022-01-12T05:26:46.017 回答