Limit Microsoft Graph Access to specific Exchange Mailboxes

Hallo zusammen,

Letztes Jahr habe ich einen Artikel geschrieben, wie man mit einer Application im AzureAD über die ClientID und einem ClientSecret via GraphAPI auf die Outlook Kalender zugreifen kann.

Schaut man sich die Permissions an, so kann man mit diesem Account auf alle Kalender der Exchange Organisation zugreifen. Eine Art von "Application Impersonation" Recht für Kalender.

Dieses unbeschränkte Recht lässt sich durch das Exchange Cmdlet "New-ApplicationAccessPolicy" einsch

New-ApplicationAccessPolicy

https://docs.microsoft.com/en-us/powershell/module/exchange/new-applicationaccesspolicy?view=exchange-ps

Dazu wird eine Mailenabled Security Group benötigt.

Für Exchange sollte es eine Universal Group vom Typ Security sein, welche Mail Enabled ist, also eine Emailadresse besitzt.

Die Gruppe hat zwei Mitglieder a.bohren@icewolf.ch und postmaster@icewolf.ch

Bisschen schade, dass eine Fehlermeldung angezeigt wird, wenn noch keine ApplicationAccessPolicy vorhanden ist.

Get-ApplicationAccessPolicy

Mit dem folgenden Befehl, wird der Zugriff der Applikation auf die Mitglieder der Gruppe beschränkt.

New-ApplicationAccessPolicy -AccessRight RestrictAccess -AppId "9a8d72df-686a-496c-bc5e-a147d813abd1" -PolicyScopeGroupId "GetSheduleAPIDemoRestriction3@icewolf.ch" -Description "Restrict this app to members of this Group"

Danach bringt der Befehl zum Abfragen keine Fehlermeldung mehr

Get-ApplicationAccessPolicy

Mit dem folgenden Beispiel Code hole ich mir einen Access Token

#Variables
$ClientID = "9a8d72df-686a-496c-bc5e-a147d813abd1"
$ClientSecret = "MyClientSecret"
$tenantID = "icewolfch.onmicrosoft.com"
$scope = "https://graph.microsoft.com/.default"
$authority = "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token"

$Body = @{
  "grant_type"    = "client_credentials";
  "client_id"     = "$ClientID";
  "client_secret" = "$ClientSecret";
  "scope"      = "$scope";
}

#Get AccessToken
$result = Invoke-RestMethod -Method POST -uri $authority -Body $body
$AccessToken = $result.access_token
$AccessToken

Für die Mailbox welche Mitglied der Gruppe ist, kann ich die Kalender abfragen

$mailbox = "a.bohren@icewolf.ch"
$headers = @{"Authorization" = "Bearer "+ $AccessToken}
$uri = "https://graph.microsoft.com/v1.0/users/$Mailbox/Calendars"
$Calendars = Invoke-RestMethod -Method GET -uri $uri -headers $headers
$Calendars.Value | fl name,id

Für eine Mailbox, welche nicht Mitglied der Gruppe ist, gibt es einen "ErrorAccessDenied" Fehler zurück.

$mailbox = "max.muster@icewolf.ch"
$headers = @{"Authorization" = "Bearer "+ $AccessToken}
$uri = "https://graph.microsoft.com/v1.0/users/$Mailbox/Calendars"
$Calendars = Invoke-RestMethod -Method GET -uri $uri -headers $headers
$Calendars.Value | fl name,id

Grüsse
Andres Bohren