我正在尝试使用ADFS对用户进行身份验证,我正在使用ADAL。认证似乎有效,因为我可以获得AccessToken。问题是查看代码authResult
包含UserInfo
,其中所有属性(例如GivenName
或FamilyName
)都是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
。
答案 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方案:
答案 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服务器上安装证书,以使应用程序能够信任执行操作。