我在 WebApi 项目中使用基于声明的授权,并有一种方法可以检查当前身份是否经过身份验证。当我使用ClaimsPrincipal.Current
当前身份未经过身份验证,但是当我使用Thread.CurrentPrincipal
it is.
ClaimsPrincipal.Current.Identity.IsAuthenticated; //False
Thread.CurrentPrincipal.Identity.IsAuthenticated; //True
这看起来很奇怪,尤其是因为MSDN 说 http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current.aspxClaimsPrincipal.Current 仅返回 Thread.CurrentPrincipal:
Remarks
默认情况下,返回 Thread.CurrentPrincipal。你可以改变这个
通过设置 ClaimsPrincipalSelector 属性来指定的行为
调用代表来确定当前的委托人。
有人可以解释一下为什么吗ClaimsPrincipal
未经过身份验证,而理论上两者都包含相同的身份?
简而言之,文档说它返回是不正确的Thread.CurrentPrincipal
默认情况下。
它实际上返回的是ClaimsPrincipal
wrapping 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
that wraps委托人的身份(同样,如果不是,实际上已经是ClaimsIdentity
).
在建设中ClaimsIdentity
,我唯一能看到最终不设置身份验证类型(从而创建未经身份验证的身份)的地方是:
if(identity is WindowsIdentity)
{
try
{
this.m_authenticationType = identity.AuthenticationType;
}
catch(UnauthorizedAccessException)
{
this.m_authenticationType = null;
}
}
So, if您通过以下方式访问的身份Thread.CurrentPrincipal.Identity
实际上是一个WindowsIdentity
实例,并且在您运行的上下文中,您具有受限的权限,构造的ClaimsIdentity
实例将有IsAuthenticated
为假。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)