【发布时间】:2022-03-23 08:09:00
【问题描述】:
我有一个独立的 Blazor WASM 站点(客户端)、一个带有受保护端点的单独 .NET 6 Web API(服务器),我正在尝试从 API 调用 MS Graph。
我已经阅读了几乎所有我能找到的关于完成这项工作所需的配置的文章,但我对增量同意失败感到困惑。尝试访问使用 MS Graph 的服务器 API 时出现以下错误:
为下游 Web API 获取令牌时出错 - MsalUiRequiredException 消息为:AADSTS65001:用户或管理员未同意使用 ID 为“[redacted]”且名为“[redacted]”的应用程序。为此用户和资源发送交互式授权请求。
配置...
-
为 Web API(服务器)创建 AAD 应用,为 Graph 配置添加机密,设置应用 URI 并在 AAD 的“公开 API”下创建
access_as_user范围。 -
将客户端 ID(来自以下步骤)添加到清单中的
knownClientApplications部分,以便在 AAD 中注册服务器应用程序。 -
对于 API 权限,我添加了图形范围
User.Read、User.Read.All和Group.Read.All,并在 AAD UI 中提供了管理员同意。 -
在 API 中配置
appsettings.json以添加来自步骤 2 的 Graph APIBaseUrl及以上范围以及正确的 AzureAD 域TenantId、ClientId和ClientSecret值,以便 MSAL 发挥作用。 -
在服务器上配置 MSAL:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
.AddInMemoryTokenCaches();
-
为 Blazor WASM 创建了 AAD 应用,使用 SPA 身份验证并重定向到
https://localhost:7014/authentication/login-callback,并将 API 权限设置为仅api://[redacted]/access_as_user。 -
根据this article创建自定义授权消息处理程序。
public CustomAuthorizationMessageHandler(IAccessTokenProvider provider, NavigationManager navigation) : base(provider, navigation)
{
ConfigureHandler(
authorizedUrls: new[]
{
"https://localhost:7069"
},
scopes: new[]
{
"api://[redacted]/.default"
});
}
- 在客户端上配置了 MSAL:
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("api://[redacted]/.default");
options.ProviderOptions.LoginMode = "redirect";
}
- 使用自定义消息处理程序在 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>();
什么有效...
- 我可以作为 AAD 用户向 Blazor 客户端进行身份验证。
- 我可以访问托管在不依赖 MS Graph 的服务器上的受保护端点(使用基于策略的授权)。
问题...
-
在this article's guidance 关于增量同意之后,特别是“静态权限”部分,我认为在服务器的应用注册上授予 Graph 的管理员同意就足够了?
-
所有显示 Blazor WASM 和受保护 API 调用受保护 API(图形)的文档都假设 Blazor 客户端也由 API 服务器托管。在我的情况下甚至可以使用代表流量吗?如果它是托管的,我可以看到 API 调用 Blazor 导航子系统来执行增量同意重定向,但是当它们分开时,我只能想象静态权限是要走的路。
-
需要在客户端设置
DefaultAccessTokenScopes吗?
【问题讨论】: