Создайте JWT с подписью сертификата X.509 в Powershell - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь получить токен доступа API из Active Directory, используя проверку подлинности сертификата, как показано здесь:

Запрос токена доступа с сертификатом

Для запроса требуется свойство client_assertion , которое представляет собой JWT, созданный из сертификата с указанным здесь форматом и спецификациями:

Формат подтверждения

Есть ли способ создания этого токена в Powershell, который не является интерактивным, поскольку он является частью конвейера выпуска?

Редактировать: чтобы сделать его немного более понятным, этот код C # с использованием библиотеки Microsoft.IdentityModel.Clients.ActiveDirectory - это то, что я пытаюсь сделать в Powershell, в частности, вторая строка:

AuthenticationContext authContext = new AuthenticationContext(authority);

IClientAssertionCertificate assertion = new ClientAssertionCertificate(clientId, certificate);

authenticationResult = await authContext.AcquireTokenAsync(resource, assertion);

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Пример кода (только что протестировал, у меня работает, когда я регистрирую приложение в качестве веб-приложения).

<#
    Sample to connect to Graph using a certificate to authenticate

    Prerequisite : ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory.dll)

#>

# Load the ADAL Assembly
Add-Type -Path "E:\Assemblies\Microsoft.IdentityModel.Clients.ActiveDirectory.4.3.0\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"

# Settings for the application
$AppID = '<ID OF THE WEB APP>'
$TenantDomain = '<TENANT>'
$LoginUri = 'https://login.microsoftonline.com/'
$Resource = 'https://graph.microsoft.com'
$Certificate = Get-Item 'Cert:\CurrentUser\My\<CERTIFICATE THUMBPRINT>' # This points to my own certificate

# Auth Authority Uri
$Authority = "$LoginUri/$TenantDomain"
# Create the authenticationContext
$Context = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::new($Authority)
# create the CAC
$CAC = [Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate]::new($AppID,$Certificate)
# Get the token
$TokenResponse = $Context.AcquireTokenAsync($Resource,$CAC)

Start-Sleep -Seconds 1 # Sleep for 1 second...

# Token should be present
$TokenResult = $TokenResponse.Result
0 голосов
/ 09 ноября 2018

Как я знаю, вы не могли использовать PowerShell для создания JWT.

Вы можете использовать jwt.io для редактирования каждой части (заголовок, полезная нагрузка), а затем jwt.io автоматически закодирует ее в JWT для client_assertion.

enter image description here

...