2012-01-06 2 views
0

DotNetOpenAuth ctp 4.0을 작동시키는 데 어려움이 있습니다. 상황은 다음과 같습니다. OAuth2 샘플과 같은 리소스 서버가 있습니다. 그러나 WCF Web Api 미리보기 6을 사용하고 있으므로 클라이언트가 요청한 작업을 요청하는 확장 지점을 작성했습니다. 이미이를 수행하도록 승인 된 경우이 작업을 수행하기 위해 ResourceServer.VerifyAccess 메서드가 호출됩니다. 이 메소드는 null 예외를 던지고 있으며, 이유를 찾지 못했습니다. 이 방법은 null 참조를 throw 않을 때이 코드가 도움이된다면DotNetOpenAuth ctp 4.0 ResourceServer.VerifyAccess() 메서드가 null 예외를 throw 함

protected override HttpRequestMessage OnHandle(HttpRequestMessage input) 
    { 
     var principal = VerifyOAuth2(input); 
     if(principal == null) 
     { 
      throw new HttpResponseException(new HttpResponseMessage 
               { 
                StatusCode = HttpStatusCode.Unauthorized, 
                Content = new StringContent("Invalid Access Token") 
               }); 
     } 

     var roles = _authorizationAttribute.Roles.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries); 
     if(!roles.Any(role => principal.IsInRole(role))) 
     { 
      throw new HttpResponseException(new HttpResponseMessage 
      { 
       StatusCode = HttpStatusCode.Forbidden, 
       Content = new StringContent("User has not permission to access this resource") 
      }); 
     } 

     return input; 
    } 

    private static IPrincipal VerifyOAuth2(HttpRequestMessage request) 
    { 
     var headers = request.Headers; 
     var headersCollection = new WebHeaderCollection(); 
     foreach (var header in headers) 
     { 
      headersCollection.Add(header.Key, header.Value.ToString()); 
     } 

     using (var signing = MvcApplication.CreateAuthorizationServerSigningServiceProvider()) 
     { 
      using (var encrypting = MvcApplication.CreateResourceServerEncryptionServiceProvider()) 
      { 
       var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(signing, encrypting)); 

       IPrincipal result; 
       var httpRequestInfo = new HttpRequestInfo(request.Method.ToString(), request.RequestUri, 
                  request.RequestUri.AbsoluteUri, headersCollection, request.Content.ReadAsStreamAsync().Result);//Since I dont have an HttpResourceInfo Object I need to build one from my request, using an overloaded method. 
       var error = resourceServer.VerifyAccess(httpRequestInfo, out result); //here is where the exception is thrown. 
       // TODO: return the prepared error code. 
       return error != null ? null : result; 
      } 
     } 

는 나도 몰라,하지만 경우에, 당신은 말해 줄 수 없습니다 :

내가 내 작업 핸들러를 작성하는 방법입니다 예외?? 어쩌면 그것은 저를 조금 도와 줄 것입니다! 미리 감사드립니다.

+0

질문 .. 어디에서 Split을하고 새로운 [] { ""}을 우연히 거기에서 오류가 발생 했습니까? 그런 식으로 보지 않으려면 사용하지 마십시오 – MethodMan

+0

아니요, 그 전에 예외가 던져지고 있습니다. VerifyOAuth2() 메서드 – Daniel

+0

IPrincipal은 .net 프레임 워크의 인터페이스입니다. input은 WCF Web Api – Daniel

답변

1

NullReferenceException에 대한 스택 트레이스가 유용 할 것입니다.

그 대신에

, 당신은 OAuthAuthorizationManager 샘플에서 수행하는 방법을 WCF에서 HttpRequestMessageProperty을 획득하고 HttpRequestInfo 생성자에 있음을 전달하는 시도가?

+0

예이 문제가 해결되었습니다! – Daniel