.net core WebAssembly Razor客户端应用程序在Azure中以管理员角色调用受保护的API时返回401

.net core WebAssembly Razor客户端应用程序在Azure中以管理员角色调用受保护的API时返回401,.net-core,azure-active-directory,bearer-token,blazor-webassembly,.net Core,Azure Active Directory,Bearer Token,Blazor Webassembly,我有一个受Azure AD保护的API,在这里获取访问数据需要身份验证,现在我只在一个简单的范围内公开API API和客户端应用程序都在Azure AD中注册。 还为API配置了角色,只有具有Admin角色的用户才能调用my API 我是否需要将此管理员角色也分配给客户端应用程序?或者AccessApi范围是否足够 Scopes Who can consent Admin consent display name User consent display name Stat

我有一个受Azure AD保护的API,在这里获取访问数据需要身份验证,现在我只在一个简单的范围内公开API

API和客户端应用程序都在Azure AD中注册。 还为API配置了角色,只有具有Admin角色的用户才能调用my API

我是否需要将此管理员角色也分配给客户端应用程序?或者
AccessApi
范围是否足够

Scopes  Who can consent     Admin consent display name     User consent display name   State 

api://xx  User              AccessApi                      AccessApi                 Enable
使用同样在Azure AD中注册的
webassembly blazor
构建客户端应用程序,并将其配置为
Api权限
,以使用
委托的
访问
AccessApi

API / Permissions name  Type       Description   Admin consent required    Status
myApi (1)   

AccessApi              Delegated     AccessApi              No

我将
webassembly blazor
客户端应用程序配置为针对azure进行身份验证,并获取令牌,然后使用该令牌调用
myApi
,但是我一直在获取
加载
,但没有显示任何数据,没有任何错误

我不确定这里出了什么问题

程序
客户端应用程序的类别:

 private static string scope = @"api://xxx/AccessApi";

...

            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");


            builder.Services.AddScoped<GraphAPIAuthorizationMessageHandler>();

            builder.Services.AddHttpClient("ServerAPI",
                client => client.BaseAddress = new Uri("https://localhost:44314"))
                .AddHttpMessageHandler<GraphAPIAuthorizationMessageHandler>();

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

            builder.Services.AddMsalAuthentication(options =>
            {
                builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
                options.ProviderOptions.DefaultAccessTokenScopes.Add(scope);
            });

授权消息处理程序类

 private static string scope = @"api://xxx/AccessApi";
    public GraphAPIAuthorizationMessageHandler(IAccessTokenProvider provider,
        NavigationManager navigationManager)
        : base(provider, navigationManager)
    {
        ConfigureHandler(
            authorizedUrls: new[] { "https://localhost:44314" },
            scopes: new[] { scope });
    }
使用Azure AD帐户对自己进行身份验证后,客户端应用程序显示
正在加载..
,但未显示任何数据。 在控制台级别显示此错误

Failed to load resource: the server responded with a status of 401 (Unauthorized)
我遵循了Microsoft文档,我不确定这里缺少了什么。 这里可能出了什么问题

更新

“Api公开”选项卡:

客户端应用程序的Api权限:
显然,您的
范围设置不正确。您应该将作用域设置为api应用程序的客户端id,而不是客户端应用程序的客户端id。在你的问题中,我认为你的范围应该是:
api://7b4d6df9-63cd-4ed7-881bxxx/AccessApi

API / Permissions name  Type       Description   Admin consent required    Status
myApi (1)   

AccessApi              Delegated     AccessApi              No

解析令牌,您将看到
scp
claim和
roles
claim


您可以通过计算在崩溃发生之前通过Main()的距离来帮助我们。我不知道这个代码环境,但是如果可以的话,你应该一步一步地完成它,否则从Main()的末尾向后删除代码,直到它不会崩溃,然后你知道你最近删除的代码就是崩溃的地方。我在整个图片和我试图实现的工作流程中添加了更多描述。用于解析访问令牌并提供屏幕截图。我看不到令牌被发送到Api的位置。
data=wait Http.GetFromJsonAsync(@“API url——在docker上本地运行”)
这会自动发生吗?您如何提供一个显示API应用程序的API的屏幕截图?顺便说一下,您还需要将客户端应用程序添加到api中。我在这里迷路了,你能再解释一下吗?我在Api中定义了作用域,该作用域由客户端应用程序使用。这里出了什么问题?@ikenahim
scope
仅由您授予客户端应用程序,它将显示在令牌中。@ikenahim根据我的方法尝试一下,看看结果如何。我在Api中创建了scope
AccessApi
,并公开了此作用域,客户端应用程序使用此作用域。我还是不明白你的意思:/。你是说已经在客户端应用程序中创建了作用域吗?不是在API上?