7

WebApiプロジェクトでクレームベースの承認を使用しており、現在のIDが認証されているかどうかを確認する方法があります。ClaimsPrincipal.Current現在のIDを使用する場合は認証されませんが、使用する場合は認証Thread.CurrentPrincipalされます。

ClaimsPrincipal.Current.Identity.IsAuthenticated; //False
Thread.CurrentPrincipal.Identity.IsAuthenticated; //True

これは特に、MSDNが ClaimsPrincipal.CurrentがThread.CurrentPrincipalを返すだけであると言っているので奇妙に思えます。

備考

デフォルトでは、Thread.CurrentPrincipalが返されます。この動作を変更するには、ClaimsPrincipalSelectorプロパティを設定して、現在のプリンシパルを決定するために呼び出されるデリゲートを指定します。

ClaimsPrincipal理論的には両方に同じIDが含まれているのに、なぜ認証されないのか誰かに説明してもらえますか?

4

1 に答える 1

10

要するに、ドキュメントは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;
   }
}

したがって、アクセスするIDThread.CurrentPrincipal.Identity実際にはWindowsIdentityインスタンスであり、実行しているコンテキストで制限されたアクセス許可を取得している場合、構築されたClaimsIdentityインスタンスはIsAuthenticatedfalseになります。

于 2013-03-11T15:28:55.480 に答える