来自PowerShell客户端的Azure AD组声明

时间:2017-04-17 20:53:48

标签: c# powershell azure-active-directory

我正在尝试使用Azure AD组声明在对REST端点进行身份验证之前检查用户是否是组的成员。我首先克隆了这个项目:https://github.com/Azure-Samples/active-directory-dotnet-webapp-groupclaims。但是,有两个小的差异。

1)我公开了一个使用用户令牌

调用GetGroups的Web API REST端点
var identity = (ClaimsIdentity)HttpContext.Current.User.Identity;
ClaimHelper.GetGroups(identity)

2)我使用PowerShell客户端而不是浏览器进行身份验证。以下是客户端获取令牌的方式:

 #This function gets an azureADToken for our app
 function Get-AzureADToken2 {

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

    $authority = "https://login.microsoftonline.com/microsoft.onmicrosoft.com"
    $authContext = New-Object -TypeName Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext -ArgumentList ($authority);

    $appIdURI = "https://mysite.azurewebsites.net"
    $clientId = "6528ed9d9-1708-4b1b-851b-f773fa32f477"
    $redirectURI = "https://mysite.azurewebsites.net/api"

    #$platparam = new-object -TypeName Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters -ArgumentList ( [Microsoft.IdentityModel.Clients.ActiveDirectory.PromptBehavior]::Auto)
    $platparam = new-object -TypeName Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters -ArgumentList ( [Microsoft.IdentityModel.Clients.ActiveDirectory.PromptBehavior]::Always)



    $authContext.AcquireTokenAsync($appIdURI, $clientId, $redirectURI,$platparam);
}

当客户端是浏览器时,一切都按预期工作,并且对getgroups的调用列出了适当的组。但是,当使用powershell客户端调用时,它会在此处抛出异常(假设该标记未从早期的浏览器会话缓存,在这种情况下没有异常):

AuthenticationResult result = await authContext.AcquireTokenSilentAsync(ConfigHelper.GraphResourceId, credential,
     new UserIdentifier(claimsIdentity.FindFirst(Globals.ObjectIdClaimType).Value, UserIdentifierType.UniqueId));

{"Failed to acquire token silently as no token was found in the cache. Call method AcquireToken"}

在调试和手动检查时,从浏览器和PS客户端收到的声明似乎几乎相同。我打开了ADAL诊断程序,但没有任何用处。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

此问题的根本原因是您的Web API缓存中没有访问令牌。代码示例使用OWIN Open ID连接组件与Azure AD进行交互,并在用户登录后获取访问令牌(检查代码Startup.Auth.cs#L39)。之后,它可以使用AcquireTokenSilentAsync方法从缓存中静默获取令牌。

在您的方案中,您可以使用代表流,使用Web API的访问令牌获取Azure AD Graph的访问令牌。有关此流程的更多详细信息,请参阅以下链接:

Calling a downstream web API from a web API using Azure AD