4

이 아닙니다. WebApi 프로젝트에서 클레임 기반 권한을 사용하고 있고 현재 ID가 인증되었는지 확인하는 방법이 있습니다. ClaimsPrincipal.Current을 사용할 때 현재 ID는 인증되지 않지만 내가 Thread.CurrentPrincipal을 사용하면 인증됩니다.Thread.CurrentPrincipal이 인증되었지만 ClaimsPrincipal.Current가

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

이것은 MSDN says ClaimsPrincipal.Current 그냥 Thread.CurrentPrincipal을 반환 특히 이후 이상한 것 같다

비고

기본적으로 Thread.CurrentPrincipal이 반환됩니다. 이 동작을 변경하려면 ClaimsPrincipalSelector 속성을 설정하여 대리자를 지정하여 현재 주체를 확인하도록 지정합니다.

누가 이론적으로 동일한 신원을 포함하고 있지만 ClaimsPrincipal이 인증되지 않은 이유를 설명해 주실 수 있습니까?

+0

"기본적으로"나에게 다른 행동이 가능하다는 것을 의미합니다. –

+0

아니요 ClaimsPrincipalSelector가 null이므로 기본값이 사용됩니다. –

답변

9

간략히 설명하면 설명서의 내용은 기본적으로 Thread.CurrentPrincipal입니다. 실제로 반환 무엇

이있는 ClaimsPrincipalThread.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을 통해 액세스하는 ID는 실제로 WindowsIdentity 인스턴스이며, 실행중인 컨텍스트에서 제한된 권한을 가지고있는 경우 ClaimsIdentity 인스턴스의 인스턴스는 IsAuthenticated이 false로 설정됩니다.

+0

Thread.CurrentPrincipal에 내 코드의 ClaimsPrincipal이 포함되어 있습니다. 게시 한 코드에서 List가 빌드 된 것을 볼 수 있지만 IsAuthenticated가 false로 설정된 이유는 나와 설명하지 않습니다. ClaimsPrincipal이 실패한 몇 가지 추가 유효성 검사를 수행하기 때문에 예를 들어 있습니까? 나는 그것이 왜 거짓인지를 알고 싶었습니다. 그래서 실패한 것을 고치거나 claimsprincipal을 인증하여 그 이유를 처음에 왜 거짓인지 알 수있었습니다. –

+2

@JosVinke - 이미 'ClaimsPrincipal'인 경우 위의 모든 내용은 동일하므로 동일한 인스턴스를 반환해야하므로 moot입니다. 'ReferenceEquals (ClaimsPrincipal.Current, Thread.CurrentPrincipal)이 true입니까? –

+0

false를 반환합니다. 차이점은 ClaimsPrincipal.Current는 System.Security.Claims.ClaimsPrincipal이고 Thread.CurrentPrincipal은 Microsoft.IdentityModel.Claims.ClaimsPrincipal입니다. 그러나 나는 왜 그것이 거짓으로 설정되어 있는지 궁금해. –