Azure Active Directory-支持多租户同意的应用程序方案

Azure Active Directory-支持多租户同意的应用程序方案,azure,azure-active-directory,Azure,Azure Active Directory,场景:我正在开发一个利用Azure Active Directory的多租户许可应用程序。该应用程序可以看作是一个闭环星形网络。我想做以下工作: 1.可以在设计时“查看”我的应用程序的白名单租户。 2.启用基于证书的身份验证-在单个租户中,这将是直截了当的。然而,我有点困惑它在多租户场景中的含义。每个应用程序(即组织)都有自己的证书。在S2S场景中,客户端组织的租户节点中的节点将安装这些证书,客户端组织的AAD应用程序的keyCredential将配置公钥令牌。那么,如何在驻留在完全不同租户中的

场景:我正在开发一个利用Azure Active Directory的多租户许可应用程序。该应用程序可以看作是一个闭环星形网络。我想做以下工作: 1.可以在设计时“查看”我的应用程序的白名单租户。 2.启用基于证书的身份验证-在单个租户中,这将是直截了当的。然而,我有点困惑它在多租户场景中的含义。每个应用程序(即组织)都有自己的证书。在S2S场景中,客户端组织的租户节点中的节点将安装这些证书,客户端组织的AAD应用程序的keyCredential将配置公钥令牌。那么,如何在驻留在完全不同租户中的目标“资源”应用程序上验证此声明。? 3.我在应用程序中公开了oAuth2Permissions,并希望使用PowerShell自动化场景。我有一个示例代码,可以单独完成以下几行:

$serviceApplication = New-AzureRmADApplication -DisplayName <AADApplicationName> -AvailableToOtherTenants $true -IdentifierUris $serviceAppIdUri `


$aad_oAuth2Perm_ReadModel = 
[Microsoft.Open.AzureAD.Model.OAuth2Permission]::New()
$aad_oAuth2Perm_ReadModel.AdminConsentDescription = ($adminConsentDisplay -f  "Model")
$aad_oAuth2Perm_ReadModel.AdminConsentDisplayName = ($adminConsentDisplay -f  "Model")
$aad_oAuth2Perm_ReadModel.Id = [guid]::NewGuid().Guid.ToString()
$aad_oAuth2Perm_ReadModel.IsEnabled = $true
$aad_oAuth2Perm_ReadModel.Type = 'User'
$aad_oAuth2Perm_ReadModel.UserConsentDescription = ($userConsentDisplay -f  "Model")
$aad_oAuth2Perm_ReadModel.UserConsentDisplayName = ($userConsentDisplay -f  "Model")
$aad_oAuth2Perm_ReadModel.Value = "Read.Model"
$aad_oAuth2Permissions.Add($aad_oAuth2Perm_ReadModel) 

Set-AzureADApplication -ObjectId $serviceApplication.ObjectId.Guid.ToString() `                    
-Oauth2Permissions $aad_oAuth2Permissions
$serviceApplication=New AzureRmADApplication-DisplayName-AvailableToOtherTenants$true-IdentifierUris$serviceAppIdUri`
$aad_oAuth2Perm_ReadModel=
[Microsoft.Open.AzureAD.Model.OAuth2Permission]::New()
$aad_oAuth2Perm_ReadModel.adminApproverDescription=($adminApproverDisplay-f“Model”)
$aad_oAuth2Perm_ReadModel.adminApproverDisplayName=($adminApproverDisplay-f“Model”)
$aad_oAuth2Perm_ReadModel.Id=[guid]::NewGuid().guid.ToString()
$aad_oAuth2Perm_ReadModel.IsEnabled=$true
$aad_oAuth2Perm_ReadModel.Type='User'
$aad_oAuth2Perm_ReadModel.UserApprovementDescription=($UserApprovementDisplay-f“Model”)
$aad_oAuth2Perm_ReadModel.UserApprovementDisplayName=($UserApprovementDisplay-f“Model”)
$aad\u oAuth2Perm\u ReadModel.Value=“Read.Model”
$aad_oAuth2Permissions.Add($aad_oAuth2Perm_ReadModel)
设置AzureADApplication-ObjectId$serviceApplication.ObjectId.Guid.ToString()`
-Oauth2Permissions$aad_Oauth2Permissions

Set-AzureADApplication调用始终失败,并出现以下错误

Set-AzureADApplication:执行SetApplication时出错 代码:Request_BadRequest 消息:除非先禁用属性值,否则无法删除该属性值


我相信我可能必须删除默认的“user_impersonation”oAuth2Permission,它是用新的AzureRmADApplication调用创建的,但我尝试的都不起作用。如何删除特定的oAuth2Permissions或用Set-AzureADApplication替换它们

这里的问题是,新的应用程序附带了默认的OAuth 2权限,您试图
设置一个全新的权限,而不包括旧的默认权限,这与
删除操作相同

一种解决方案是读取应用程序上所有现有的OAuth 2权限,然后在现有权限的基础上添加新权限,然后执行
SET
调用。这将避免正在进行的“删除”调用

另一个选项是按照API的警告执行。现有的OAuth 2权限需要
IsEnabled=$false
才能删除。在尝试添加新权限之前,可以读入旧权限,禁用该权限,然后将其删除

我相信这两种解决方案都可以解决您的特定错误消息。完全清楚地说,我并没有真正理解您的情况,所以我不知道即使在您解决了这个问题之后,您是否会实现您的最终目标


如果有帮助,请告诉我。

Shawn,您关于读取现有权限并将其与新权限集一起禁用的建议已奏效。这回答了我原始问题列表中的第3个问题。关于问题#1和#2,我试图从本质上A)找到一种方法,在设计时通过白名单或在运行时通过验证一组相关声明,将多租户应用程序的范围限定到一组受限制的租户;B)试图找到如何在此场景中实现基于证书的授权。多租户应用程序在Azure Active Directory中,租户使用应用程序时没有继承限制。AAD在配置中也不支持任何类似的自定义。相反,您必须通过您的服务自行配置,使用Graph API或令牌中的内容来确定租户是否满足您的条件。确定。Approvles和oAuthorizationPermissions是客户机绑定的声明-任何人都可以接受这些声明并在令牌中呈现相关声明。作为一个资源应用程序,我可以对客户端资源要求什么?我的问题是,我是否可以让客户端为提供密钥凭据,例如,这同样很奇怪,因为客户端必须随身携带我的证书才能在令牌中生成这些声明。作为一种资源,您可以控制令牌中出现的一些“附加声明”,例如组成员声明、目录角色声明、,安全组织声称。但是,与客户端证书相关的任何内容或此类内容只能在客户端和身份提供者之间共享。作为资源,您应该对身份验证过程中使用的秘密不透明。这些声明类型是否适用于多租户场景?