【问题标题】:Access O365 Exchange Online with an Azure Managed Identity or Service Principal使用 Azure 托管标识或服务主体访问 O365 Exchange Online
【发布时间】:2021-01-05 06:31:28
【问题描述】:

我在 Powershell 中有一个程序,它在 Azure Function 应用程序中运行,该应用程序还有一个名为“AuditO365”的托管标识。它使用托管标识连接到 Azure Key Vault 以检索用户凭据。它使用这些凭据连接到 O365 Exchange Online 以获取所需的数据。这工作正常:

    $uSecret = $ENV:APPSETTING_SecretUsername
    $pSecret = $ENV:APPSETTING_SecretPassword 
    $sasSecret = $ENV:APPSETTING_SecretSAS

    $securePassword = ConvertTo-SecureString -String $pSecret -AsPlainText -Force

    $UserCredential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $uSecret, $securePassword

    $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
    Import-PSSession $session

凭据是在 Azure Active Directory 中创建的基本用户帐户,用户对数据源 (O365 Exchange Online) 可见。在 Exchange Admin Center 下的 O365 中,我可以看到用户名,并且可以将用户名分配给具有所需权限(“仅查看审核日志”)的正确自定义角色组(“查看审核读者”)。

但是,我现在想尝试使用托管标识,以使解决方案更加健壮。由于函数已经有一个托管标识(“AuditO365”),我想在上面的 Exchange Online 的自定义角色组中用这个标识替换当前用户帐户,但似乎 O365 看不到托管标识!所有 Azure 资源和 O365 都在同一个帐户/订阅下运行。

我也尝试在 Azure 中创建服务主体(具有 O365 的 API 权限),但 O365 也无法看到:

1.如何使 Azure Function 的托管标识对 O365 / Exchange Online 可见?

2.我是否可以使用此托管身份针对 Exchange Online 对应用进行身份验证、连接和检索数据,就像它目前使用普通用户帐户所做的那样?

【问题讨论】:

  • 对你有用吗?如果它对您有帮助,您可以接受它作为答案吗?
  • 我会试一试并回复您。感谢您的帮助。

标签: azure powershell exchange-server azure-managed-identity


【解决方案1】:

如果您想在 Azure 功能中连接 Exchange Online 和 Azure MSI,请参考blog

详细步骤如下。

  1. 创建 Azure 函数

  2. Enable Azure MSI for Azure function

  3. 为 MSI 配置一些设置

    一个。将 Exchange Online API 权限 Exchange.ManageAsApp 分配给 MSI。完成此操作后,应用程序有权管理 Exchange Online

    Connect-AzureAD
    
    #assign permmions
    $sp =Get-AzureADServicePrincipal -Filter  "displayName eq 'Office 365 Exchange Online'"
    
    $permision=$sp.AppRoles.Where({$_.Value -eq 'Exchange.ManageAsApp'})
    
    New-AzureADServiceAppRoleAssignment -ObjectId <the Objectid of MSI> -Id $permision[0].Id -PrincipalId <the Objectid of MSI> -ResourceId $sp.ObjectId
    

    b.分配 Azure AD 角色。 应用程序需要分配适当的 AD 角色。由于应用是在 Azure AD 中预配的,因此您可以使用任何内置角色。支持以下角色:

    • 全局管理员
    • 合规管理员
    • 安全阅读器
    • 安全管理员
    • 服务台管理员
    • Exchange 管理员
    • 全球阅读器

    关于如何分配角色,请参考here。例如

    Connect-AzureAD
    #assign role
    $role=Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Reader'"
    
    Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId a5d5a5e1-0f26-474d-a105-3553004c973b
    
  4. 功能

#get token with MSI
$resourceURI = "https://outlook.office365.com/"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token
$Authorization = "Bearer {0}" -f $accessToken 
$Password = ConvertTo-SecureString -AsPlainText $Authorization -Force

$Ctoken = New-Object System.Management.Automation.PSCredential -ArgumentList "OAuthUser@<your tenant GUID>",$Password
 
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/PowerShell-LiveId?BasicAuthToOAuthConversion=true -Credential $Ctoken -Authentication Basic -AllowRedirection -Verbose
Import-PSSession $Session | Format-List

Get-Mailbox 

Remove-PSSession $Session

【讨论】:

  • 试过这个,但在我们获取 MSI 令牌的部分的第 3 行没有工作。见image
  • 另外$role=Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Reader'" 也没用。将其修改为以下内容,它似乎有效:$role = (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Global Reader"}).Objectid
  • @MAK 在 Azure 云 shell 中,我们无法运行上述脚本。因为我们无法使用 Function MSI 获取访问令牌。
  • @MAK 请在 Azure 函数中运行脚本。
  • @Drumor 在 Azure 函数中启用 Azure MSI 时,这些将作为环境变量存储在 Azure 函数中。
猜你喜欢
  • 1970-01-01
  • 2020-06-02
  • 2018-07-22
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多