簡體   English   中英

獨立 Blazor WASM、AAD、.NET Core 6 Web API 調用 MS Graph 時出現問題

[英]Trouble with On-Behalf-Of flow with standalone Blazor WASM, AAD, .NET Core 6 Web API calling MS Graph

我有一個獨立的 Blazor WASM 站點(客戶端),一個單獨的 .NET 6 web API(服務器)和受保護的端點,我正在嘗試從 API 調用 MS Graph。

我已經閱讀了幾乎所有我能找到的關於使這項工作所需的配置的文章,但我對增量同意失敗感到困惑。 嘗試訪問使用 MS Graph 的服務器 API 時出現以下錯誤:

為下游獲取令牌時出錯 web API - MsalUiRequiredException 消息為:AADSTS65001:用戶或管理員未同意使用 ID 為“[redacted]”且名為“[redacted]”的應用程序。 為此用戶和資源發送交互式授權請求。

配置...

  1. 為 Web API(服務器)創建了 AAD 應用程序,為圖形配置添加了秘密,設置了應用程序 URI 並在 AAD 中的“公開 API”下創建了access_as_user scope。

  2. 將客戶端 ID(來自以下步驟)添加到 AAD 中服務器應用程序注冊清單中的knownClientApplications部分。

  3. 對於 API 權限,我添加了圖形范圍User.ReadUser.Read.AllGroup.Read.All並在 AAD UI 中提供了管理員許可。

  4. appsettings.json中配置了 appsettings.json,以將步驟 2 中的圖形 API BaseUrl和以上范圍以及 MSAL 的正確 AzureAD 域、 TenantIdClientIdClientSecret值添加到 function。

  5. 在服務器上配置的 MSAL:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
        .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
    .AddInMemoryTokenCaches();
  1. 為 Blazor WASM 創建了 AAD 應用程序,使用 SPA 身份驗證和重定向到https://localhost:7014/authentication/login-callback並將 API 權限設置為api://[redacted]/access_as_user only。

  2. 根據本文創建了自定義授權消息處理程序。

public CustomAuthorizationMessageHandler(IAccessTokenProvider provider, NavigationManager navigation) : base(provider, navigation)
{
  ConfigureHandler(
      authorizedUrls: new[]
      {
          "https://localhost:7069"
      },
      scopes: new[]
      {
          "api://[redacted]/.default"
      });
}
  1. 在客戶端上配置的 MSAL:
builder.Services.AddMsalAuthentication(options =>
{
  builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
  options.ProviderOptions.DefaultAccessTokenScopes.Add("api://[redacted]/.default");
  options.ProviderOptions.LoginMode = "redirect";
}
  1. 使用自定義消息處理程序在 Blazor 客戶端上設置名為 HTTP 的客戶端:
var baseAddress = builder.Configuration["PublicApiUrl"];

builder.Services.AddHttpClient("PublicApi", client =>
{
    client.BaseAddress = new Uri(baseAddress);
}).AddHttpMessageHandler<CustomAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("PublicApi"));
builder.Services.AddScoped<CustomAuthorizationMessageHandler>();

什么有效...

  1. 我可以作為 AAD 用戶向 Blazor 客戶端進行身份驗證。
  2. 我可以訪問托管在不依賴於 MS Graph 的服務器上的受保護端點(使用基於策略的授權)。

問題...

  1. 按照本文關於增量同意的指南,特別是“靜態權限”部分,我假設在服務器的應用程序注冊上授予管理員對 Graph 的同意就足夠了嗎?

  2. 所有顯示 Blazor WASM 和受保護的 API 調用受保護的 API(圖)的文檔都假設 Blazor 客戶端也由 API 服務器托管。 在我的案例中甚至可以使用代流嗎? 如果它被托管,我可以看到 API 調用 Blazor 導航子系統來執行增量同意重定向,但是當它們分開時,我只能想象 static 權限是通往 go 的方式。

  3. 是否需要在客戶端設置DefaultAccessTokenScopes

這里的問題是在構建 API 應用程序時使用AddMicrosoftGraph方法。

AddMicrosoftGraph創建的GraphServiceClient將默認訪問分配給用戶委派權限,而不是分配給應用程序應用程序權限 這就是拋出MsalUiRequiredException的原因,通常通過提示用戶登錄來解決。

您可以在此處閱讀有關委托權限與應用程序權限的更多信息。

你可以做的是使用AddMicrosoftGraphAppOnly方法創建一個GraphServiceClient ,它將使用特定於你的 API 的憑據從 Microsoft Graph API 檢索所需的相關數據。

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraphAppOnly(
        authenticationProvider => new GraphServiceClient(authenticationProvider))
    .AddInMemoryTokenCaches();

只要您擁有appsettings.json文件的AzureAd部分中提供的相關設置和機密,注入到您的應用程序中的GraphServiceClient現在應該能夠訪問您需要的數據。

您可以在此處閱讀有關使用appsettings.json文件中的AzureAd設置進行應用配置的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM