从PowerShell获取Azure功能应用程序的授权令牌

时间:2018-04-04 08:01:34

标签: powershell azure authentication authorization azure-active-directory

我在为我的azure应用程序获取令牌时遇到了问题

这是代码

function Get-Token
{
    ipmo "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
    ipmo  "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll"

    $clientId = "1b730954-1685-4b74-9bfd-dac224a7b894"
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob"
    $resourceAppIdURI = "https://ios111.azurewebsites.net/"

    $authority = "https://login.microsoftonline.com/common/"
    $authContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]$authority
    $authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $redirectUri, "Auto")
    $authResult.CreateAuthorizationHeader()
}

我收到以下错误

  

异常调用" AcquireToken"用" 4"参数:" AADSTS65005:   资源无效。客户端已请求访问资源   未列在客户端应用程序中的请求权限中   注册。客户端应用ID:1b730954-1685-4b74-9bfd-dac224a7b894。   来自请求的资源价值:https://ios111.azurewebsites.net/。   资源应用ID:f4c1cc8d-629a-4c7e-836a-120ff078e664。有效名单   应用注册资源:。

但是,如果我将$ resourceAppIdURI更改为

$ resourceAppIdURI =" https://management.core.windows.net/"

一切都好,并且我有权使用收到的令牌访问我的应用程序(如果我将Authorization标头值设置为此令牌),但没有我在应用程序清单中为此用户定义的角色声明我想检查一下。

如果我只是从浏览器访问我的功能,在登录页面将我重定向回功能后,浏览器没有指定授权标头,但功能上下文中的ARRAffinity cookie和ClaimsPrincipal.Current.Claims具有正确的角色声明。因此,似乎在PS的情况下,.AcquireToken获取的JWT令牌被反序列化为ClaimsPrincipal.Current而不使用内部Web应用程序逻辑。

有关如何授予PS客户端访问我的应用程序权限的任何想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

要获得具有所需角色的Azuere App Token,您需要ClientId和Secret,以及所需的权限设置,如果需要管理员同意,您应该点击“授予权限”#39; Azure门户中应用程序属性的按钮。

然后,如果所有设置都正确,您可以获得这样的标记(包括角色):

Microsoft Graph API

的示例
$adal = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
[System.Reflection.Assembly]::LoadFrom($adal) | Out-Null

$TenantName = "tenant.onmicrosoft.com"
$ClientId = "d1245516-2bg3-1234-123d-7cd067ff66b4" # Your AppId (Just a sample)
$Secret = "H7dd+PejUddGhuuGYY234Xhhhjs7739iQn112317zg=" # Your App Key Secret (Just a sample)

$AuthId = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential($clientId,$secret)
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$resourceAppIdURI = "https://graph.microsoft.com"
[uri]$authority = "https://login.windows.net/$TenantName/oauth2/authorize"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
$Token = $authResult = $authContext.AcquireToken($resourceAppIdURI, $AuthId)

要检查令牌,您可以使用此JWT令牌解码器,以查看它是否具有所需的角色:

http://jwt.calebb.net/

答案 1 :(得分:0)

解决了!

感谢你们的帮助!

实际上,我必须注册原生 azure应用程序,为其提供WebApp访问权限,并在上面的脚本中将此appId用作clientId。使用" 1b730954-1685-4b74-9bfd-dac224a7b894"以及已知的PowerShell clientId可能适用于标准的MS应用程序,但是你无法为你的应用程序进行大PS访问,至少不是来自azure portal。

这是链接https://markscholman.com/2016/08/consuming-azure-api-app-azure-ad-authentication-using-powershell/,由WayneYang-MSFT给出了逐步说明