2013-06-13 3 views
3

웹 API를 구현했습니다.WebApi : User.Identity.IsAuthenticated 첫 번째 요청에 대해 true이고 그 이후에 false

<authentication mode="None" /> 

기본 권한을 사용하고 Thread.CurrentPrincipal을 내 AuthorizeAttribute에 설정합니다.

응용 프로그램을 시작/디버깅 한 후 처음으로 서버 측에서 Thread.CurrentPrincipal (IsAuthenticated = true로 설정) 요청을 제출하고 IsAuthenticated가 내 컨트롤러에서 true를 반환합니다. 그러나이 이후의 모든 요청은 Thread.CurrentPrincipal을 정상적으로 설정하지만 실행이 내 컨트롤러 메서드에 도달하면 컨트롤러의 User.Identity 속성이 변경되고 IsAuthenticated = false가됩니다.

응용 프로그램을 시작한 후 처음으로 IsAuthenticated = true를 왜인지 알 수 없습니까?! Thread.CurrentPrinciple을 수동으로 설정하고있을 때마다 매번 그러해야합니다. 그러나 어딘가에있을 때와 내 컨트롤러를 때리면 대체됩니다!

UPDATE

그것은 내가 추가 한 MediaTypeFormatter 함께 할 수있는 뭔가입니다. 포맷터를 제거하면 문제가 발생하지 않습니다. 실행됩니다 포맷터의 코드는 다음과 같습니다 :

public override Task<object> ReadFromStreamAsync(Type type, System.IO.Stream webStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      string temporaryFilePath = Path.Combine(TemporaryDirectory, Path.GetRandomFileName()); 

      using (FileStream fileStream = new FileStream(temporaryFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.Read)) 
      { 
       webStream.CopyTo(fileStream); 
      } 

      return (object)new CustomFile(temporaryFilePath); 
     }); 
    } 

답변

2

대답은 몇 가지 세부 here에 설명되어 있습니다.

요약하면 Thread.CurrentPrincipal을 설정하는 것만으로는 충분하지 않습니다. 나는 HttpContext.Current.User를 너무 설정했고, 작동 중이다.

원래 게시물에서 MediaTypeFormatter의 비동기 메서드가 호출되어 추가 스레드가 만들어져 CurrentPrinciple이 다른 스레드에 연결되고 컨트롤러 액션이 실행되는 끝이 아닙니다.

두 곳에서 설정해야하는 이유는 설명은 here입니다. 그것은 말한다 :

Thread.CurrentPrincipal :이 속성에 스레드의 주체를 설정하는 표준 방법입니다 응용 프로그램에서 사용자 지정 인증 논리를 수행

경우 두 곳의 주체를 설정해야합니다. 그물. HttpContext.Current.User :이 속성은 ASP.NET에만 적용되는 입니다.

다음 코드는 주요 설정하는 방법을 보여줍니다 :

웹 호스팅
private void SetPrincipal(IPrincipal principal) 
{ 
    Thread.CurrentPrincipal = principal; 
    if (HttpContext.Current != null) 
    { 
     HttpContext.Current.User = principal; 
    } 
} 

, 당신은 두 곳의 주체를 설정해야합니다; 그렇지 않으면 보안 컨텍스트가 일치하지 않을 수 있습니다. 그러나 자체 호스팅의 경우 이지만 HttpContext.Current는 null입니다. 따라서 코드가 호스트 독립적 인 지 확인하려면 그림과 같이 HttpContext.Current에 할당하기 전에 null을 확인하십시오.