我在为我的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客户端访问我的应用程序权限的任何想法吗?
谢谢!
答案 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令牌解码器,以查看它是否具有所需的角色:
答案 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给出了逐步说明