使用ADAL从UFS中的ADFS获取UserInfo

时间:2017-10-12 17:23:44

标签: authentication uwp adal userinfo

我正在尝试使用ADFS对用户进行身份验证,我正在使用ADAL。认证似乎有效,因为我可以获得AccessToken。问题是查看代码authResult包含UserInfo,其中所有属性(例如GivenNameFamilyName)都是null

AuthenticationContext authContext = null;
AuthenticationResult authResult;
try
{
    authContext = new AuthenticationContext(authority, false);
    authResult = await authContext.AcquireTokenAsync(resource, clientId, new Uri(returnUri),
                    new PlatformParameters(PromptBehavior.Auto, false));
}

由于ADFS配置,这些值为空?我注意到解码了AccessToken返回我可以读取用户信息。但我不认为解码JWT令牌是获得这些信息的正确方法。你有更好的建议吗?

我也看到人们通过使用声明获取信息,但我不知道如何在UWP上使用它,因为我找到的所有样本都使用

ClaimsPrincipal claimsPrincipal = System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal;

但是UWP上没有System.Threading.Thread

2 个答案:

答案 0 :(得分:0)

通常,access_token用于Oauth和OpenID连接方案,并且打算由资源使用。为了识别用户,我们应该使用id_token(验证令牌并通过解码令牌来提取与用户相关的声明)。请参考以下有关令牌的使用情况:

  
      
  • id_token:用于表示用户身份的JWT令牌。该   ' AUD'或id_token的受众声明匹配的客户端ID   本机或服务器应用程序。
  •   
  • access_token:Oauth和OpenID连接方案中使用的JWT令牌   并打算供资源使用。 ' aud'或观众   此标记的声明必须与资源或Web的标识符匹配   API。
  •   
  • refresh_token:提交此令牌代替收集用户   凭证提供单点登录体验。这个令牌是   由AD FS发行和使用,客户无法读取   或资源。
  •   

您可以将以下关于本机客户端的链接引用到ADFS的Web API方案:

AD FS Scenarios for Developers - Native client to Web API

答案 1 :(得分:0)

取决于服务器的ADFS版本。如果您的公司正在使用Windows Server 2012 R2,则它是ADFS 3.0。我确实与我工作的公司的管理员创建的SSO登录成功集成。在尝试使用https://docs.microsoft.com/en-us/previous-versions/adfs-windows-server-2012r2/dn660968(v=msdn.10)之前,您应该先参考本文。注意:您甚至不需要制作ToDoList的网络api。

仅使用GetAuthorizationHeader()和authenticationContext.AcquireTokenAsync(),就可以通过要求用户授权其凭据并解密接收令牌来获取令牌。

这是我做过的代码示例:

authority = https://contoso.com/adfs/ls(来自ADFS元数据的端点)

resourceURI = https:// localhost:44300 /(依赖方,请您的ADFS管理员进行注册)

clientID =建议从“包装”选项卡中使用Package.appmanifest的软件包名称。只要它是唯一的ID。

clientReturnURI =使用以下代码获取clientReturnURI(在链接的文章中也可用):

string clientReturnURI = string.Format(“ ms-appx-web://Microsoft.AAD.BrokerPlugIn/ {0}”,WebAuthenticationBroker.GetCurrentApplicationCallbackUri()。Host.ToUpper());

AuthenticationContext ac =新的AuthenticationContext(Authority_Uri,false); AuthenticationResult ar =等待ac.AcquireTokenAsync(resourceURI,GlobalVar.clientID,new Uri(clientReturnURI),new PlatformParameters(PromptBehavior.Always,true));

            var jwt = new JwtSecurityToken(ar.AccessToken);
            string unique_name = jwt.Claims.First(c => c.Type == JwtRegisteredClaimNames.UniqueName).Value;

您可以将JwtRegisteredClaimNames.UniqueName替换为其他任何内容。这取决于访问令牌中可用的信息/声明。您应该通过在var jwt处放置断点来检查jwt中的可用信息。或者,您可以在以下网站的AuthenticationResult.AccessToken中解密访问令牌: https://jwt.ms/

最后,您需要从ADFS管理员安装证书,并在Web和UWP服务器上安装证书,以使应用程序能够信任执行操作。