我在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管理中心下,我可以看到用户名,并且能够将用户名分配给具有所需权限(“仅查看审核日志”)的正确的自定义角色组(“查看审核阅读器”)。
但是,我现在想尝试使用托管身份,以使该解决方案更加可靠。由于该功能已经具有托管身份(“ AuditO365”),因此我想在上面的Exchange Online中的自定义角色组中用该身份替换当前用户帐户,但看来O365无法看到托管身份!所有Azure资源和O365都在同一帐户/订阅下运行。
我也尝试过在Azure中创建服务主体(具有O365的API权限),但是O365也无法看到它:
1。。如何使O365 / Exchange Online可以看到Azure功能的托管身份?
2。。我可以使用此托管身份来针对Exchange Online验证应用程序,连接和检索数据(与使用普通用户帐户当前的数据一样)吗?
答案 0 :(得分:2)
如果要将Azure Online中的Exchange Online与Azure MSI连接,请参阅blog
详细步骤如下。
创建Azure函数
为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中配置的,因此您可以使用任何内置角色。支持以下角色:
关于如何分配角色,请参阅here。例如
Connect-AzureAD
#assign role
$role=Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Reader'"
Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId a5d5a5e1-0f26-474d-a105-3553004c973b
功能
#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