Проверка подлинности сценария Powershell Exchange EWS с использованием Oauth, получающего ошибку 401, если разрешение приложения full_access_as_app не предоставлено - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь преобразовать некоторые сценарии EWS для использования oauth. Я обнаружил, что это работает, когда зарегистрированному приложению Azure было дано разрешение приложения full_access_as_app, но не когда оно установлено только на делегированные разрешения EWS.AccessAsUser.All. Похоже, что если задано full_access_as_app, то любой пользователь с appID и секретом может получить доступ к любому почтовому ящику Когда указан EWS.AccessAsUser.All, никто не может получить доступ к любому почтовому ящику. На что я надеялся, так это то, что appID и secret были, по сути, ключами к шлюзу, но тогда доступ к почтовому ящику будет зависеть от того, будет ли конкретный пользователь, выполняющий скрипт, или учетные данные, переданные с ним (чего я не знаю, как делать, если это не вошел в систему пользователя), имеет разрешения на почтовый ящик. Итак, по сути, вы попадаете в ворота, но затем вы используете подражание. Также не похоже, что секрет приложения может храниться в защищенном файле ha sh, как учетные данные, поэтому секрет раскрыт. Спасибо за вашу помощь.

## Request an access token

# Define AppId, secret and scope, your tenant name and endpoint URL
$AppId = 'AppId'
$AppSecret = 'AppSecret'
$Scope = "https://outlook.office365.com/.default"
$TenantName = "domain.onmicrosoft.com"
$Url = "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token"

# Add System.Web for urlencode
Add-Type -AssemblyName System.Web

# Create body
$Body = @{
    client_id = $AppId
    client_secret = $AppSecret
    scope = $Scope
    grant_type = 'client_credentials'
}

# Splat the parameters for Invoke-Restmethod for cleaner code
$PostSplat = @{
    ContentType = 'application/x-www-form-urlencoded'
    Method = 'POST'

    # Create string by joining bodylist with '&'
    Body = $Body
    Uri = $Url
}

# Request the token!
$Request = Invoke-RestMethod @PostSplat

#######################

$Email = "UserA@domain.com"

# Import "Microsoft Exchange Web Services Managed API 2.2"
Import-Module -Name "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"

## Create the Exchange Service object with Oauth creds
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList Exchange2013_SP1
$service.Url= new-object Uri("https://outlook.office365.com/EWS/Exchange.asmx")
$Service.TraceEnabled = $true
$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$Email)
$service.HttpHeaders.Add("X-AnchorMailbox", $Email)
$Service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials($Request.access_token)

$OAuthCredentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials($Request.access_token)
$service.Credentials = $OAuthCredentials

#####################

# WellKnown folders to adjust
$folderNames = "Inbox"

Foreach($folderName in $folderNames)
    {
        # Set the WellKnownFolder
        $FolderId = [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::$folderName

        # Bind to WellKnownFolder Notes
        $folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service, $folderId)

        Write-Host "$($Email): $($folderName):  " -NoNewline
        $folder.archivetag.RetentionId.Guid     

    } # Foreach($folderName... END

######################

1 Ответ

0 голосов
/ 20 марта 2020

Вы должны перейти на использование делегированного разрешения . С делегированным разрешением вы сможете получить доступ к API как конкретный пользователь c.

enter image description here

Итак, вам нужно добавить разрешение EWS.AccessAsUser.All и получить токен следующим образом:

## Request an access token

# Define AppId, secret and scope, your tenant name and endpoint URL
$AppId = 'your app id'
$AppSecret = 'your app key'
$Scope = "https://outlook.office365.com/.default"
$TenantName = "{your_tenant}.onmicrosoft.com"
$Url = "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token"

# Add System.Web for urlencode
Add-Type -AssemblyName System.Web

# Create body
$Body = @{
    client_id = $AppId
    client_secret = $AppSecret
    scope = $Scope
    grant_type = 'password'
    username = 'your user name here, e.g.,jack@hanxia.onmicrosoft.com'
    password = 'your password here ******************'
}

# Splat the parameters for Invoke-Restmethod for cleaner code
$PostSplat = @{
    ContentType = 'application/x-www-form-urlencoded'
    Method = 'POST'

    # Create string by joining bodylist with '&'
    Body = $Body
    Uri = $Url
}

# Request the token for user!
$Request = Invoke-RestMethod @PostSplat

$Request.access_token
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...