【问题标题】:Daemon console app calling Azure AD cant find AppRole (MSAL)调用 Azure AD 的守护程序控制台应用程序找不到 AppRole (MSAL)
【发布时间】:2021-04-15 14:22:30
【问题描述】:

我在 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 API 的 Manifest 文件

...
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 没有角色属性。

【问题讨论】:

  • 虽然你有一个“正确”的令牌,但我还是想再检查一次。如果您创建了一个暴露 api 并添加应用程序角色的天蓝色广告应用程序(代表服务)?如果您创建了另一个同意刚刚暴露的api权限的Azure广告应用程序(代表客户)?如果您在守护程序应用程序中设置第二个应用程序的客户端 ID 和密码?我想我需要运行您提供的示例并尝试重现您的错误。
  • 我在 Azure 中创建了一个 REST API 应用程序,它公开了一个没有范围的 API (api;//),因为这意味着仅供应用程序使用。以及 Azure 中配置为使用该 API 的另一个客户端应用程序。
  • 对不起,我的回复晚了,我已经在我的地方测试了样品,这是工作结果。 i.stack.imgur.com/Bec7d.png
  • 我已经添加了我的步骤,您可以将我的设置与您的设置进行比较,以检查是否有一些差异,这可能会导致错误。如果存在,请随时分享您的进一步问题:)

标签: azure api azure-active-directory console-application msal


【解决方案1】:

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

  1. 创建一个 azure 广告应用作为服务。注册应用程序时,我只输入名称字段,其他人保持默认。

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

  1. 如下图所示添加角色:

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

  1. 设置示例代码,需要修改各个工程的appsetting.json文件,api工程中的controller文件。控制器中需要更改的值取决于 api。在我这边,你可以看到第5步的截图,它显示了api://xxx/App.Role,所以我将值设置为App.Role

【讨论】:

  • 非常感谢,但问题出在后端,当我收到消息时,我在 Kafka 级别进行了验证,没有定义 applicationRole,只有 User 和 Admin 因为我不得不更改应用程序的名称.角色给(用户)。感谢您的帮助:)
  • 感谢您的回复和您的标记:)
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 2019-07-15
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2012-07-26
相关资源
最近更新 更多