简而言之,文档说它Thread.CurrentPrincipal
默认返回是不正确的。
它实际返回的是一个ClaimsPrincipal
包装 Thread.CurrentPrincipal
(如果不是,实际上,已经是 a 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
包装主体身份的 a (同样,如果它不是,实际上已经是 a 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。