Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PowerShell对AAD进行身份验证并将Graph API作为守护进程应用程序调用?_Powershell_Azure Active Directory_Adal_Azure Ad Graph Api - Fatal编程技术网

如何使用PowerShell对AAD进行身份验证并将Graph API作为守护进程应用程序调用?

如何使用PowerShell对AAD进行身份验证并将Graph API作为守护进程应用程序调用?,powershell,azure-active-directory,adal,azure-ad-graph-api,Powershell,Azure Active Directory,Adal,Azure Ad Graph Api,我正在尝试在Azure Active Directory上进行一些非常快速的测试,我想使用一个守护程序应用程序来访问Graph API,而不需要用户在场进行身份验证。我想验证我的应用程序注册是否可以成功地向AAD进行身份验证,我的客户端密码是否有效,并调用AAD Graph API 我已经在我的目录中注册了一个“Web App/API”,并且我已经将其设置为具有在仅应用程序上下文中调用AAD Graph API的适当权限。我还为我的应用程序生成了一个应用程序密钥/证书,这样我就可以作为机密客户端

我正在尝试在Azure Active Directory上进行一些非常快速的测试,我想使用一个守护程序应用程序来访问Graph API,而不需要用户在场进行身份验证。我想验证我的应用程序注册是否可以成功地向AAD进行身份验证,我的客户端密码是否有效,并调用AAD Graph API

我已经在我的目录中注册了一个“Web App/API”,并且我已经将其设置为具有在仅应用程序上下文中调用AAD Graph API的适当权限。我还为我的应用程序生成了一个应用程序密钥/证书,这样我就可以作为机密客户端进行身份验证


我想看看我的AAD令牌,以及调用后Graph API的输出。如何使用PowerShell快速完成此任务?

此问题与在何处创建PowerShell脚本以作为本机客户端应用程序进行身份验证非常相似。但是,在这种情况下,会有一些微妙而重要的区别,因为您希望作为机密客户机进行身份验证。具体地说,我们需要创建一个
客户端凭据
,这样我们就可以在没有用户作为身份验证的情况下进行身份验证

首先,您需要下载并保存ADAL的.NET DLL。下载链接可以在Nuget上找到

注意:我们在这里专门使用ADAL v2

您可以使用文件提取器提取.nupkg的内容,如 7z、WinZip等

\lib\net45\
中提取内容,并将其复制到工作目录中。我把这些文件放在他们自己的“ADAL”文件夹中,以便将它们分开

然后,您应该能够使用以下内容创建新的PowerShell脚本:

# Load ADAL
Add-Type -Path ".\ADAL\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"

# Output Token and Response from AAD Graph API
$accessToken = ".\Token.txt"
$output = ".\Output.json"

# Application and Tenant Configuration
$clientId = "<AppIDGUID>"
$tenantId = "<TenantID>"
$resourceId = "https://graph.windows.net"
$login = "https://login.microsoftonline.com"

# Create Client Credential Using App Key
$secret = "<AppKey>"


# Create Client Credential Using Certificate
#$certFile = "<PFXFilePath>"
#$certFilePassword = "<CertPassword>"
#$secret = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate -ArgumentList $certFile,$certFilePassword


# Get an Access Token with ADAL
$clientCredential = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential($clientId,$secret)
$authContext = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("{0}/{1}" -f $login,$tenantId)
$authenticationResult = $authContext.AcquireToken($resourceId, $clientcredential)
($token = $authenticationResult.AccessToken) | Out-File $accessToken


# Call the AAD Graph API 
$headers = @{ 
    "Authorization" = ("Bearer {0}" -f $token);
    "Content-Type" = "application/json";
}

Invoke-RestMethod -Method Get -Uri ("{0}/{1}/users?api-version=1.6" -f $resourceId,$tenantId)  -Headers $headers -OutFile $output
#加载ADAL
添加类型-Path“\ADAL\Microsoft.IdentityModel.Clients.ActiveDirectory.dll”
#AAD图形API的输出令牌和响应
$accessToken=“.\Token.txt”
$output=“.\output.json”
#应用程序和租户配置
$clientId=“”,以及一个包含AAD图形API响应的JSON文件


让我知道这是否有帮助!

使用客户端id、密码和资源调用RestMethod
到令牌端点不是更简单吗?如果使用客户端凭据授予,则不需要ADAL。是的,这对证书场景来说意味着更多,但它很容易包装到应用程序密钥中,我决定也包括它。@juunas同样,使用
client\u secret
通常会导致在脚本中以明文形式存在的秘密,这些秘密往往会被(过度)共享,并且总体上管理不当。使用证书会产生需要创建有符号断言的开销(ADAL非常容易做到这一点),但消除了脚本本身的秘密。@PhilippeSignoret非常正确,您只需要在AAD中生成证书,将其添加到应用程序中,并将其安装到计算机上的证书存储中,就有这样的开销。@juunas同意,首先设置和授权客户端证书也有开销。我有一个简单的帮助我的PowerShell配置文件中的r函数,该函数生成一个短期(几天)证书,并用于授权相关应用程序上的证书。