使用Azure托管身份或服务主体访问O365 Exchange Online

时间:2020-09-18 10:09:42

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

我在Powershell中有一个程序,该程序在Azure Function应用程序中运行,该应用程序也具有称为“ AuditO365”的托管身份。它使用托管身份连接到Azure密钥保管库以检索用户凭据。它使用这些凭据连接到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)。在O365的Exchange管理中心下,我可以看到用户名,并且能够将用户名分配给具有所需权限(“仅查看审核日志”)的正确的自定义角色组(“查看审核阅读器”)。

enter image description here

但是,我现在想尝试使用托管身份,以使该解决方案更加可靠。由于该功能已经具有托管身份(“ AuditO365”),因此我想在上面的Exchange Online中的自定义角色组中用该身份替换当前用户帐户,但看来O365无法看到托管身份!所有Azure资源和O365都在同一帐户/订阅下运行。

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

enter image description here

1。。如何使O365 / Exchange Online可以看到Azure功能的托管身份?

2。。我可以使用此托管身份来针对Exchange Online验证应用程序,连接和检索数据(与使用普通用户帐户当前的数据一样)吗?

1 个答案:

答案 0 :(得分:2)

如果要将Azure Online中的Exchange Online与Azure MSI连接,请参阅blog

详细步骤如下。

  1. 创建Azure函数

  2. Enable Azure MSI for Azure function

  3. 为MSI配置一些设置

    a。向MSI分配Exchange Online API权限Exchange.ManageAsApp。之后,该应用程序有权管理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

enter image description here