[英]Why ClaimsPrincipal.Current is returned null even when the user is authenticated?
[英]Thread.CurrentPrincipal is authenticated but ClaimsPrincipal.Current is not
我在我的WebApi项目中使用基于声明的授权,并且有一种方法可以检查当前身份是否经过身份验证。 当我使用ClaimsPrincipal.Current
,当前的身份未经过身份验证,但是当我使用Thread.CurrentPrincipal
它就是。
ClaimsPrincipal.Current.Identity.IsAuthenticated; //False
Thread.CurrentPrincipal.Identity.IsAuthenticated; //True
这看起来很奇怪,特别是因为MSDN说 ClaimsPrincipal.Current只返回Thread.CurrentPrincipal:
备注
默认情况下,返回Thread.CurrentPrincipal。 您可以通过设置ClaimsPrincipalSelector属性来指定要调用的委托来确定当前主体,从而更改此行为。
有人可以解释一下为什么ClaimsPrincipal
未经过身份验证,而理论上两者都包含相同的身份吗?
简而言之,文档说它默认返回Thread.CurrentPrincipal
是不正确的。
它实际返回的是一个ClaimsPrincipal
包装 Thread.CurrentPrincipal
(如果它实际上不是,已经是一个ClaimsPrincipal
),使用这个构造函数:
public ClaimsPrincipal(IPrincipal principal)
{
this.m_version = "1.0";
this.m_identities = new List<ClaimsIdentity>();
if (principal == null)
{
throw new ArgumentNullException("principal");
}
ClaimsPrincipal principal2 = principal as ClaimsPrincipal;
if (principal2 == null)
{
this.m_identities.Add(new ClaimsIdentity(principal.Identity));
}
else if (principal2.Identities != null)
{
this.m_identities.AddRange(principal2.Identities);
}
}
反过来,正如你所希望看到的那样,返回一个包含委托人身份的ClaimsIdentity
(再次,如果不是,实际上,已经是一个ClaimsIdentity
)。
在构造ClaimsIdentity
,我唯一可以看到它最终没有设置身份验证类型(从而创建未经过身份验证的身份)的地方在这里:
if(identity is WindowsIdentity)
{
try
{
this.m_authenticationType = identity.AuthenticationType;
}
catch(UnauthorizedAccessException)
{
this.m_authenticationType = null;
}
}
因此, 如果您通过Thread.CurrentPrincipal.Identity
访问的标识实际上是WindowsIdentity
实例,并且在您运行的上下文中您具有受限制的权限,则构造的ClaimsIdentity
实例将IsAuthenticated
为false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.