要するに、ドキュメントは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);
}
}
これは、うまくいけばわかるように、プリンシパルのIDClaimsIdentity
をラップするを返します(これも、実際には、すでにではありませんClaimsIdentity
)。
を構築する際ClaimsIdentity
に、認証タイプを設定しない(したがって、認証されていないIDを作成する)場所を確認できる唯一の場所は次のとおりです。
if(identity is WindowsIdentity)
{
try
{
this.m_authenticationType = identity.AuthenticationType;
}
catch(UnauthorizedAccessException)
{
this.m_authenticationType = null;
}
}
したがって、アクセスするIDがThread.CurrentPrincipal.Identity
実際にはWindowsIdentity
インスタンスであり、実行しているコンテキストで制限されたアクセス許可を取得している場合、構築されたClaimsIdentity
インスタンスはIsAuthenticated
falseになります。