调用 Azure AD 的守护进程控制台应用找不到 AppRole (MSAL)

Daemon console app calling Azure AD cant find AppRole (MSAL)

我在 Azure 中注册了两个应用程序,一个是 REST API 一个是调用 REST API 的守护进程控制台应用程序。 工作流程如图

Daemon console app --call for token using secret--> Azure AD 
Daemon console app use the return token to call --> REST API.

我确实获得了令牌,并且在管理员同意的情况下在 REST API 中定义了正确的 AppRole。 但是,当我尝试调用 REST API 守护程序控制台应用程序时抛出此错误

Failed to call the web API: InternalServerError
Content: System.ArgumentException: Requested value 'ApplicationRole' was not found.
   at System.Enum.TryParseByName(RuntimeType enumType, String originalValueString, ReadOnlySpan`1 value, Boolean ignoreCase, Boolean throwOnFailure, UInt64& result)

我在这里遵循了官方 MS 文档 https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/tree/master/2-Call-OwnApi

我解码了它定义了角色的 JWT 令牌:

...
"oid": "xxxxx",
  "rh": "xxxx",
  "roles": [
    "ApplicationRole"
  ],
...

REST的Manifest文件API

...
appRoles": [
        {
            "allowedMemberTypes": [
                "Application"
            ],
            "description": "Daemon apps in this role can consume the web api.",
            "displayName": "ApplicationRole",
            "id": "unique uid",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "ApplicationRole"
        }
    ],
...

管理员同意也被授予守护程序控制台应用程序

API / Permissions name     Type          Description          Admin consent require      Status

IoT-Manager (1)  
ApplicationRole       Application    ApplicationRole           Yes                   Granted for XX

这里有什么问题吗?

更新

我调试 Daemon 应用程序我发现访问令牌不包含角色

...

AuthenticationResult result = null;

try
            {
                result = await app.AcquireTokenForClient(scopes)
                    .ExecuteAsync();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Token acquired \n");
                Console.WriteLine(result.AccessToken);
               
                Console.WriteLine("Token ExpireOn \n");
                Console.WriteLine(result.ExpiresOn);

                Console.ResetColor();
            }
...

当我打印访问令牌并对其进行解码时,它显示它具有 AppRoles,而当我调试对象时 AuthenticationResult result 没有角色属性。

我已经 运行 您提供的示例并且效果很好,我将在下面展示我的步骤。

  1. 创建 azure 广告应用程序作为服务。注册app时,我只填name字段,其他保持默认。

  2. 接下来我在这个应用中暴露了一个api。公开一个 API-> 添加范围-> 保留默认应用程序 ID url-> 保存并继续-> 如下编辑我的范围:

  1. 添加如下截图的角色:

  1. 正在创建另一个 azure 广告应用程序作为客户端,也只输入名称字段。
  2. 创建客户端密码并添加 api 权限。

  1. 设置示例代码,需要修改每个项目的appsetting.json文件,以及api项目中的controller文件。需要在控制器中更改的值取决于 api。我这边可以看到步骤5的截图,显示的是api://xxx/App.Role,所以我设置的值为App.Role.