Blazor WebAssembly Standalone 访问多个 AAD 保护的 API

Cir*_*ger 5 azure-active-directory .net-core webassembly blazor-client-side webapi

我已设法使默认模板正常工作(我的 blazor 独立 SPA 应该从不同的 ADApp - webAPI 获取多个范围的令牌;即使我定义了 extraScopes 或 defaultaccesstokenscopes,我也设法当时仅获取一个范围的令牌)。

builder.Services.AddMsalAuthentication(options =>
{
    var config = options.ProviderOptions;
    config.Authentication.Authority = "https://login.microsoftonline.com/tenantID";
    config.Authentication.ClientId = "clientID";
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("https://graph.microsoft.com/user.read");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("https://tenant.crm.dynamics.com/user_impersonation");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("clientID/scope1");
    // tried this too
    // config.AdditionalScopesToConsent.Add("https://tenant.crm.dynamics.com/user_impersonation");
});
Run Code Online (Sandbox Code Playgroud)

现在有一个问题是如何获取其他令牌,因为如果提到多个范围,它只会获取“clientID”范围的令牌......?并在 HttpClient 请求中使用 wasm 页面中的那些令牌?

在 Angular 中(使用 MSAL),这一切都是自动完成的,您定义所需的范围,它就会获取所有令牌。然后它拦截所有请求,并按请求的域添加授权标头和相应的令牌。

这里是否有类似的机制,或者应该通过为每个请求添加相应的令牌并将 HttpRequestMessage 与 HttpClient.SendAsync() 一起使用来手动完成?

显然,对于业务应用程序来说,如果不接触某种受保护的 API(通常是同一 AAD 中的应用程序),就没有多大用处。例如,假设它可以是对 Dynamics CRM 的 webapi 的简单查询。