如何通过 Azure 门户将应用分配给应用角色?

How to assign app to app roles through the Azure portal?

场景:

我实际上能够设置这种情况,但 Azure 门户中有一个非常令人困惑的部分,我只能使用 PowerShell 修复,我想问一下:这种行为是设计的还是是否存在我可以在不使用 PowerShell 的情况下进行此配置的门户的另一部分?

好的,创建这个场景的步骤:

  1. 在租户中注册应用程序 B(隐式创建服务主体)
  2. 更新应用程序 B 的清单以添加新的 appRole,它是 'admin' 并且允许的类型是 "user" 和 "application" 参见:https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/entity-and-complex-type-reference#approle-type

  3. 在租户中注册应用程序A(隐式创建服务主体)

  4. 转到应用程序 A 所需的权限边栏选项卡。

    • 问题1:为什么角色只出现在应用权限部分,而没有出现委托权限?

      我将 appRole 设置为 "application" 或 "user" 类型,但它只会显示在 UX 的 "application permissions" 秒中。我的理解是,如果您使用刷新令牌代表用户请求令牌,那么您使用委派权限部分,如果您使用秘密或证书请求令牌,您应该获得应用程序权限。

    现在,select来自应用程序 B 的 'admin' 申请权限并保存

您可以验证这更新了应用程序 A 清单的 requiredPermissions 秒以包含来自应用程序 B 的管理员角色。

  1. 为应用程序 A 生成密钥,以便我们可以在未经用户同意的情况下请求令牌。

现在我转到我的应用程序代码并使用 ADAL 获取令牌,例如:

var authenticationContext = new 
AuthenticationContext("https://login.windows.net/<tenant-id>", 
TokenCache.DefaultShared);
var clientCredential = new ClientCredential("<app-A-app-id>", "<app-A-key");
var authenticationResult = authenticationContext.AcquireTokenAsync("<app-b-
resource-id/app-id-url>", clientCredentials);
authenticationResult.AccessToken

现在,将令牌交给 jwt.io 进行检查,我希望令牌中包含 "roles": [ "admin" ] 声明,但它没有。此时我尝试返回 B 的清单添加自定义 oauth2Permissions(参见:https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/entity-and-complex-type-reference#oauth2permission-type),然后更新 A 以要求这些,但再次生成了一个新令牌并且它没有将这些列为范围在令牌中。

在我开始使用 PowerShell 进行调查之前,我完全被难住了。

如果您使用此处的代码段:

Get-AzureADServiceAppRoleAssignment -ObjectId $spA.ObjectId 它returns没什么!尽管我已经访问了需要权限的应用程序并且 select 从 B!

编辑了角色

这就引出了问题2: 如果他们不创建应用程序角色分配,select 门户中的应用程序权限意味着什么?

我使用以下方法手动创建了角色分配: `New-AzureADServiceAppRoleAssignment -Id $role.ObjectId -PrincipalId $spA.ObjectId -ResourceId $spB.ObjectId -ObjectId $spA.ObjectId 当服务主体 A 请求资源/服务主体 B 的令牌时,这转化为创建 'admin' 的角色分配。

问题三:为什么要同时指定ObjectId和PrincipalId作为原则A的对象id?

问题 4:如果可能,如何在门户中创建应用程序角色分配?

奖金:

因为显式设置应用程序 A 对 B 所需的权限对令牌没有任何影响。我验证了即使删除了所有必需的权限,(不依赖于 B)我仍然可以使用 A 凭据获取 B 资源的令牌。 问题 5:这是否意味着租户中的任何应用程序都可以为租户中的任何其他应用程序请求令牌? 我之前的理解是,应用程序 A 必须在它能够为其请求令牌的应用程序上明确设置所需的权限。

例如,如果您希望您的网站 api 向 Microsoft Graph api 发出请求,难道您不需要声明吗?

Why is does the role only show up in the application permissions section and not also delegated permissions?

因为 appRole 从来都不是委派权限。通过将用户分配给应用程序并为他们选择角色,可以将应用程序角色分配给用户。它用于在应用程序中赋予某些 users/groups 某些角色。

如果你想要委托权限,那么你定义一个oauth2Permission。

What does it mean to select application permissions in the Portal if they do not create app role assignements?

它只设置了需要的权限。要创建应用角色分配,您必须以管理员身份授予权限。这可以通过门户中的“授予权限”按钮或在登录 Azure AD 时使用 prompt=admin_consent 来完成。

Why do we need to specify both ObjectId and PrincipalId both to be the object id of principle A?

实际上,当通过图形手动创建应用角色分配时 API 您不必指定 ObjectId。 PowerShell 是强制性的吗?

If possible, how do I create application role assignments in the portal?

以上回答,运行管理员同意。

Does this mean any app in the tenant can request token for any other application in the tenant?

这个我其实不太确定,待会再测试。但是无论如何,令牌中不会有任何角色,对吧?所以你的授权应该阻止它吗?