You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WASM多租户登录及调用自有受保护API问题求助

解决方案

核心问题分析

AADSTS500011错误的本质是:当使用organizational租户允许任意组织用户登录时,客户端请求的令牌资源(原配置中的API ClientID)在用户所在的租户中不存在对应服务主体。多租户API需要在用户租户中通过权限同意完成实例化,且令牌请求必须使用API的应用ID URI而非直接用ClientID作为资源标识。


步骤1:修正API应用注册的Scope配置

  1. 进入Azure门户的API应用注册页面,切换到公开API标签
  2. 设置应用ID URI(建议使用默认的api://{API-ClientID},也可自定义)
  3. 添加所需的权限Scope(比如access_as_user),确保Scope的完整格式为api://{API-ClientID}/access_as_user

步骤2:调整Blazor WASM客户端的认证配置

修改Program.cs中的认证初始化代码

将原来直接添加API ClientID的代码:

options.ProviderOptions.DefaultAccessTokenScopes.Add("{API-ClientID}");

替换为使用完整的API Scope路径:

options.ProviderOptions.DefaultAccessTokenScopes.Add("api://{API-ClientID}/access_as_user");

确认appsettings.json配置

确保租户和权限配置正确:

{
  "AzureAd": {
    "Authority": "https://login.microsoftonline.com/organizations",
    "ClientId": "{Client-ClientID}",
    "ValidateAuthority": true
  },
  "ApiBaseAddress": "https://localhost:5001",
  "Scopes": "api://{API-ClientID}/access_as_user"
}

步骤3:配置API端的多租户认证

修改API的Program.cs

使用Microsoft.Identity.Web正确配置多租户API认证:

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

// 支持多租户令牌验证
builder.Services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
    options.TokenValidationParameters.ValidateIssuer = false; // 允许任意租户令牌,或自定义Issuer验证逻辑
    options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
    {
        // 可选:仅验证Microsoft组织租户的Issuer
        if (issuer.StartsWith("https://login.microsoftonline.com/") && issuer.EndsWith("/v2.0"))
        {
            return issuer;
        }
        throw new SecurityTokenInvalidIssuerException("Invalid issuer");
    };
});

确认API的appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "organizations",
    "ClientId": "{API-ClientID}"
  }
}

步骤4:处理跨租户权限同意

当非API注册租户的用户首次登录并调用API时,需要完成权限同意流程:

  1. 在客户端添加引导同意的逻辑,比如在首次API调用失败时触发交互式请求获取带同意的令牌:
var tokenResult = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "api://{API-ClientID}/access_as_user" }, 
    authenticationProperties: new AuthenticationProperties { RedirectUri = "/" });

if (tokenResult.Status == TokenResultStatus.RequiresInteraction)
{
    await _tokenAcquisition.SignOutAsync();
    await _tokenAcquisition.SignInAsync(new[] { "api://{API-ClientID}/access_as_user" });
}
  1. 或者在API应用注册的API权限标签中,将目标权限设置为允许用户同意(仅适用于非管理员级权限),减少管理员干预。

验证要点

  • 客户端和API的Authority必须统一设置为https://login.microsoftonline.com/organizations
  • 令牌请求的Scope必须是API公开的完整URI格式,不能直接使用ClientID
  • 跨租户用户首次访问时,必须完成权限同意(用户或管理员级别)

内容的提问来源于stack exchange,提问作者C Hall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:05:36