无法从Identity Server 3获取用户信息

时间:2017-05-07 07:39:42

标签: asp.net-mvc identityserver3 openid-connect

我正在尝试关注创建具有混合流客户端的Identity Server的this教程。在我通过用户信息端点获取用户信息之前,这一切都很好。

Notifications = new OpenIdConnectAuthenticationNotifications
{
    AuthorizationCodeReceived = async n =>
    {
        var userInfoClient = new UserInfoClient(new Uri(Constants.UserInfoEndpoint).ToString());
        var userInfoResponse = await userInfoClient.GetAsync(n.ProtocolMessage.AccessToken);

        var identity = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);

        identity.AddClaims(userInfoResponse.Claims);

        n.AuthenticationTicket = new AuthenticationTicket(identity, n.AuthenticationTicket.Properties);
    }
}

我在添加声明时遇到编译错误:identity.AddClaims(userInfoResponse.Claims);

错误区域实际上是两个。指向参数时的时间说:

  

参数类型   “System.Collections.Genereic.IEnumerable   [mscorlib,版本= 4.0.0.0,文化=中性,   PublicKeyToken = b77a5c561934e089]'不能分配给参数类型   '[mscorlib,版本= 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089]'

另一个,当指向方法名称时说:

  

类型'Claim'在未引用的程序集中定义。您   必须添加对程序集'System.Security.Claims的引用,   Version = 4.0.1.0,Culture = neutral,PublicKeyToken = 503f5 ..'

我尝试通过nuget添加对此程序集的引用,但随后又发生了另一个冲突。 IdentityProvider和mscorlib之间的System.Security.Claims存在模糊的引用。

如何实现我的目标,即将用户声明分配给已登录用户的身份?

1 个答案:

答案 0 :(得分:0)

看一下教程,这一行:

identity.AddClaims(userInfoResponse.Claims);
必须改变

identity.AddClaims(userInfoResponse.GetClaimsIdentity().Claims);

使用Claim类型而不指定命名空间会导致第二个编译器错误。确定您明确使用Claim的位置并为其添加正确的命名空间。

注意:

这个:userInfoResponse.GetClaimsIdentity().Claims相当于:

userInfoResponse.Claims.Select(c => new System.Security.Claim(c.Item1, c.Item2))