我正在尝试关注创建具有混合流客户端的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存在模糊的引用。
如何实现我的目标,即将用户声明分配给已登录用户的身份?
答案 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))