使用Powershell获取Azure AD令牌(jwt)

时间:2018-01-03 03:09:39

标签: powershell azure azure-active-directory

我正在尝试使用Powershell使用用户名/密码身份验证从AAD获取jwt令牌。

我正在编写一个PowerShell脚本,它将使用持票令牌调用API。如果我复制&从使用API​​的SPA粘贴令牌。我正在寻找一种从我的PowerShell中检索令牌的方法。

这看起来很有希望:https://github.com/Azure-Samples/active-directory-dotnet-native-headless/blob/master/TodoListClient/Program.cs

我觉得我正在试图创建一个'UserPasswordCredential'对象的墙上撞我的头。任何有关我如何做到这一点的线索都会非常有帮助。

我有Add-Type-ed:
- Microsoft.IdentityModel.Clients.ActiveDirectory.dll
- Microsoft.IdentityModel.Clients.ActiveDirectory.platform.dll(什么都不添加?)
- Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll
- Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll

'UserPasswordCredential'的文档页面: https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.clients.activedirectory.userpasswordcredential
它应该在前两个dll之一

这是在“约束与优惠”下限制',让我觉得它可能实际上不可能来自powershell: http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/

查看下面的代码,第一个获取令牌成功,第二个失败 - 可能/可能是因为$ cred是UserCredential而不是UserPasswordCredential。

是否可以使用PowerShell执行此操作?

最后,在完全不同的轨道上,如何找到我的应用程序需要的redirectUri和resourceAppIdURI的值?当我查看AAD控制台和浏览器到我的企业应用程序时,我可以找到AppId(我可以用作$ clientId)。
我不确定redirectUri对我来说是非常必要的,因为我真正想要的只是令牌,但我可以很好地猜测它应该是什么。 当我尝试使用我的应用程序详细信息调用第一个AquireToken方法(没有$ cred)时,它会失败并显示以下消息:

Exception calling "AcquireToken" with "4" argument(s): "AADSTS50001: The application named https://myappwithapi/Login was not found in the tenant named me.onmicrosoft.com.

通过查看我的天蓝色门户网站,我是否可以找到resourceAppIdURI的require值? 'https://myappwithapi/Login'来自我的天蓝色门户>企业应用> [app'>属性> HomepageUrl

代码:

#setup
$TenantName = "mme.onmicrosoft.com"
$clientId = "1950a258-227b-4e31-a9cf-717495945fc2" # Microsoft
$clientId = "03faf8db-..........................." #

$username = "me@me.onmicrosoft.com"
$password = Read-Host -AsSecureString -Prompt "Enter Password"


# add dlls
$adal = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$adalforms = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll"
$adalplatform = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.platform.dll"
[System.Reflection.Assembly]::LoadFrom($adal) | Out-Null
[System.Reflection.Assembly]::LoadFrom($adalforms) | Out-Null
[System.Reflection.Assembly]::LoadFrom($adalplatform) | Out-Null



#prep request
$redirectUri = "urn:ietf:wg:oauth:2.0:oob" # Microsoft
$resourceAppIdURI = "https://graph.windows.net"
$authority = "https://login.windows.net/$TenantName"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority


# Get Token prompting for creds
$authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $redirectUri, "Always")
$authResult


# Get the cred
$cred = New-Object -TypeName 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential' -ArgumentList $username, $password
#$cred = New-Object -TypeName 'Microsoft.IdentityModel.Clients.ActiveDirectory.UserPassCredential' -ArgumentList $username, $password
$authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $cred)

$authResult

1 个答案:

答案 0 :(得分:3)

这篇文章中有一个问题。

您的基本用例“使用Powershell获取Azure AD令牌(jwt)”是一个常见的用例,并且有几个示例和预先构建的示例可供使用。例如:

https://github.com/pcgeek86/AzureADToken PowerShell模块,允许您从Azure Active Directory(AAD)获取JSON Web令牌(JWT)。

https://gallery.technet.microsoft.com/Get-Azure-AD-Bearer-Token-37f3be03 此脚本获取一个承载令牌,该令牌可用于使用Postman等工具对Azure Resource Manager API进行身份验证。它使用随Azure SDK一起安装的Active Directory身份验证库。

查看这两个资源是否解决了您的使用基线用例。

至于...... “通过查看我的天蓝色门户网站,我是否有可能找到resourceAppIdURI的require值?”

您可以通过远程PowerShell登录AzureAD来执行此操作。安装AAD PowerShell模块。 https://docs.microsoft.com/en-us/powershell/azure/overview?view=azurermps-5.1.1 https://msdn.microsoft.com/en-us/library/dn135248(v=nav.70).aspx

下载并安装MSOL。使用MSOL登录 https://www.microsoft.com/en-US/download/details.aspx?id=39267 Microsoft Online Services登录助手提供最终用户登录功能

并使用内置cmdlet从组织设置中提取信息,或者点击MSGraph API和查询。 https://docs.microsoft.com/en-us/powershell/azure/active-directory/install-adv2?view=azureadps-2.0 您可以将Azure Active Directory PowerShell模块版本用于Azure AD管理任务的图形

至于这一个: “我如何找到我的应用程序需要的redirectUri和resourceAppIdURI的值?” 这是您门户网站的应用注册部分。开发人员团队提供redir uri而不是Azure。这是注册过程的一部分,其他所有内容都是由Azure App Reg流程生成的。

应用程序注册过程就在这里,当然你是其他人必须在AzureAD中注册这个应用程序,因此可以随时检索它: https://blogs.msdn.microsoft.com/onenotedev/2015/04/30/register-your-application-in-azure-ad

可以使用...

检索任何已注册的应用及其详细信息
Get-AzureADApplication
Get-AzureADApplication | Select -Property *
(Get-AzureADApplication).ReplyUrls
Get-AzureADApplication | Select -Property AppID, DisplayName,ReplyUrls

https://docs.microsoft.com/en-us/powershell/module/azuread/get-azureadapplication?view=azureadps-2.0