Invoke-RestMethod для приложения, требующего аутентификации Azure - PullRequest
0 голосов
/ 05 марта 2019

Как вызвать API для аутентификации Azure с помощью Powershell?Точнее говоря, я хочу, чтобы эта строка работала: Invoke-RestMethod -Method Get -Uri 'https://contoso.com/api/Hello

Мой API локальный (но видимый в Интернете) и имеет настроенную и обязательную проверку подлинности Azure AD.

Я хочу проходить аутентификацию через Powershell программно, чтобы я мог вызывать API без необходимости какого-либо дополнительного взаимодействия.

В настоящее время я получаю 401 ошибок при выполнении Invoke-RestMethod независимо от того, чтоЯ делаю.

Об API

Я использую пример приложения cp asp.net core c #, созданного в Visual Studio (с использованием метода проверки подлинности на рабочем месте или в школе).Этот процесс создал в Azure регистрацию приложения, и я вручную создал секрет клиента в Azure.

То, что я пытался

Теперь, используя Powershell, я заполнил следующее

$Params = @{
    'client_id' = '' 
    'Redirect_URI' = ''
    'TenantID' = '' 
    'response_type'='code'

}
$ClientSecret = ''

Оттуда я получил код авторизации, используя:

$Query = "?"; $Params.Keys | % {$Query+= "$($_)=$($Params.Item($_))&"} ; $Query = $Query.TrimEnd('&')


$IE= new-object -ComObject "InternetExplorer.Application"
$IE.Visible = $true
$IE.navigate2("https://login.microsoftonline.com/$($params.TenantID)/oauth2/authorize$Query")
Write-Host 'Press enter when Code is displayed in URL'

pause 
$Code = [System.Web.HttpUtility]::ParseQueryString(([uri]$ie.LocationURL).Query)['code']
$ie.quit()

Наконец, я получаю токен доступа, используя следующее:

$TokenResult = Invoke-RestMethod -Method Post -ContentType 'application/x-www-form-urlencoded' -Uri "https://login.microsoftonline.com/$($Params.TenantID)/oauth2/v2.0/token" -Body @{
    client_id     = $Params.client_id
    scope         = 'User.Read offline_access'
    code          = $Code
    redirect_uri  = $Params.Redirect_URI
    grant_type    = 'authorization_code'
    client_secret = $ClientSecret
} 

Однако, если я сейчас попытаюсь вызвать API, используя:

Invoke-RestMethod 'https://SomeDomain.com/api/values' -Headers @{Authorization = "Bearer $($TokenResult.access_token)"}

Результат

Я получаю несанкционированный 401

Мои наблюдения

Я верю, что яуспешно использовал описанный ниже метод для взаимодействия с Graph API и другими API Azure.Однако это не работает при вызове моего собственного API, который стоит за аутентификацией Azure.

Как мне сделать правильный вызов, который позволил бы мне аутентифицироваться на моем частном API с использованием аутентификации Azure?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Согласно вашему сценарию, вы должны указать свой заголовок как Headers @{Authorization = "Bearer "+ $TokenResult.access_token}.Есть образец, который я использую.

$Params = @{
    'client_id' = '' 
    'redirect_URI' = ''
    'response_type'='code'
    'scope' = 'https://graph.microsoft.com/.default offline_access'
}
$ClientSecret ='.C$S|NAYQ:q)ES2w(A)*]Xp5T-?Fx+[aKE+YtmcaX!u1!{>T*wVJ70h:Q2s'
$TeantID = 'e4c9ab4e-bd27-40d5-8459-230ba2a757fb'
$Query = "?"; $Params.Keys | % {$Query+= "$($_)=$($Params.Item($_))&"} ; $Query = $Query.TrimEnd('&')


$IE= new-object -ComObject "InternetExplorer.Application"
$IE.Visible = $true
$IE.navigate2("https://login.microsoftonline.com/$($TeantID)/oauth2/authorize$Query")
Write-Host 'Press enter when Code is displayed in URL'
pause 
Add-Type -AssemblyName System.Web
$Code = [System.Web.HttpUtility]::ParseQueryString(([uri]$ie.LocationURL).Query)['code']
$ie.quit()

$TokenResult = Invoke-RestMethod -Method Post -ContentType 'application/x-www-form-urlencoded' -Uri "https://login.microsoftonline.com/$($TeantID)/oauth2/v2.0/token" -Body @{
    client_id     = $Params.client_id
    scope         = 'User.Read offline_access'
    code          = $Code
    redirect_uri  = $Params.Redirect_URI
    grant_type    = 'authorization_code'
    client_secret = $ClientSecret
}

 Invoke-RestMethod -Method Get -Uri 'https://graph.microsoft.com/v1.0/me' -Headers @{Authorization = "Bearer "+ $TokenResult.access_token}

Для получения более подробной информации, пожалуйста, обратитесь к https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow

0 голосов
/ 05 марта 2019

Полагаю, вы не настроили свой API в AAD.Чтобы получить доступ к API через приложение AD, вам также необходимо создать приложение AD для вашего API на портале, см. Регистрация приложения в конечной точке Azure Active Directory v2.0. и настройка его для предоставленияAPI, см .: Настройка приложения для предоставления веб-API (предварительный просмотр) и Настройка клиентского приложения для доступа к веб-API (предварительный просмотр) .После этого вы сможете вызывать API, такие как Graph API, API Office 365 и т. Д.

Вы можете разработать веб-API и сделать его доступным для клиентских приложений, предоставляя разрешения / области и роли.Правильно настроенный веб-API становится доступным, как и другие веб-API Microsoft, включая Graph API и API Office 365.

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