我们有一个 Azure PowerShell 脚本来自动配置客户订阅中的资源。作为该过程的一部分,我们根据托管在我们自己的图像库中的自定义图像部署 VM。为此,我们要求客户在其租户中授予对我们企业应用程序的访问权限(用户同意)。
截至目前,我们通过 OAuth2 链接实现这一点,我们要求他们使用自己的租户 ID 进行编辑并在浏览器中打开:
https://login.microsoftonline.com/<customer-tenant-id>/oauth2/authorize?client_id=cd3df191-153a-4ae1-9766-5fe7a7f3032e&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com
此链接对他们进行身份验证并要求接受请求的权限:
之后,我们的企业应用程序应该在他们的订阅中列出,并具有以下权限:
我们希望通过我们的部署脚本以编程方式解决这个先决条件。我们有什么办法可以通过 Azure PowerShell 实现这一点吗?
无济于事,我在网上查了好几页,还有几个类似的问题。它们在请求管理员同意而不是用户同意的意义上有所不同(请注意,我们只需要用户同意,请参见下面的屏幕截图)。此外,有些问题特定于 Azure CLI 或只是 Azure 门户(因为我们正在使用 Azure PowerShell,所以不是我们的选项)。
PS:抱歉,我对 Azure AD 和一般的同意框架缺乏了解。
答案 0 :(得分:0)
同意可用于授予应用角色(应用权限)和委派权限。
您在此处尝试做的是创建委托权限授予。具体来说,您试图代表单个用户(而不是代表所有用户)授予委派权限。
您无法使用 Azure PowerShell 执行此操作。
但是,您可以使用 Microsoft Graph PowerShell 执行此操作。您使用的 cmdlet 将是 New-MgOauth2PermissionGrant。此 cmdlet 将 Microsoft Graph API 调用到 create a delegated permission grant。 PowerShell cmdlet 需要以下参数:
ClientId
- 客户端应用程序的服务主体的对象 ID。这是将获得特权的服务主体。ConsentType
- 在这种情况下,这应该是“委托人”,表示您要代表单个委托人(用户)授予此委托权限。PrincipalId
- 这是用户的对象 ID,代表客户端应用程序将能够执行的操作。ResourceId
- API 服务主体的对象 ID。这是表示 API 的服务主体,用于公开您要授予的委托权限。Scope
- 要授予的权限的空格分隔列表。因此,例如,如果我们想代表用户主体名称为 bob@example.com 的用户授予 Microsoft Graph 委派权限 User.Read,我们可以执行以下操作:< /p>
$userUpn = "bob@example.com"
$clientAppId = "738a2731-dd81-4263-824b-74cf6dee9da0"
$resourceSpn = "https://graph.microsoft.com"
$scope = "User.Read"
# Retrieve the user, and the client and resource service principals
$user = Get-MgUser -Filter "userPrincipalName eq '$userUpn'"
$client = Get-MgServicePrincipal -Filter "appId eq '$clientAppId'"
$resource = Get-MgServicePrincipal -Filter "servicePrincipalNames/any(n:n eq '$resourceSpn')"
# Grant the delegated permissions for Microsoft Graph to the client, on behalf of the user
$grant = New-MgOAuth2PermissionGrant `
-ClientId $client.Id `
-ConsentType "Principal" `
-PrincipalId $user.Id `
-ResourceId $resource.Id `
-Scope $scope