调用 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
没有角色属性。
我已经 运行 您提供的示例并且效果很好,我将在下面展示我的步骤。
创建 azure 广告应用程序作为服务。注册app时,我只填name字段,其他保持默认。
接下来我在这个应用中暴露了一个api。公开一个 API-> 添加范围-> 保留默认应用程序 ID url-> 保存并继续-> 如下编辑我的范围:
- 添加如下截图的角色:
- 正在创建另一个 azure 广告应用程序作为客户端,也只输入名称字段。
- 创建客户端密码并添加 api 权限。
- 设置示例代码,需要修改每个项目的appsetting.json文件,以及api项目中的controller文件。需要在控制器中更改的值取决于 api。我这边可以看到步骤5的截图,显示的是api://xxx/App.Role,所以我设置的值为
App.Role
.
我在 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
没有角色属性。
我已经 运行 您提供的示例并且效果很好,我将在下面展示我的步骤。
创建 azure 广告应用程序作为服务。注册app时,我只填name字段,其他保持默认。
接下来我在这个应用中暴露了一个api。公开一个 API-> 添加范围-> 保留默认应用程序 ID url-> 保存并继续-> 如下编辑我的范围:
- 添加如下截图的角色:
- 正在创建另一个 azure 广告应用程序作为客户端,也只输入名称字段。
- 创建客户端密码并添加 api 权限。
- 设置示例代码,需要修改每个项目的appsetting.json文件,以及api项目中的controller文件。需要在控制器中更改的值取决于 api。我这边可以看到步骤5的截图,显示的是api://xxx/App.Role,所以我设置的值为
App.Role
.