2013-02-28 2 views
14

C#의 VS 2012 WCF 서비스 응용 프로그램 템플릿을 사용하여 REST 서비스와 OAuth2.0 인증 계층을 통합하는 데 도움이 필요합니다. 이 WCF는 클라이언트 (컨슈머)가 리소스에 액세스 할 수있게하기 전에 서비스의 인증 및 인증을 위해 토큰을 발행해야합니다. 세 다리가있는 인증은 내가 바라는 것입니다. 트위터, LinkedIn, Google OAuth 구현과 비슷합니다.REST WCF 서비스 응용 프로그램과 통합 된 OAuth 2.0

인터넷에서 OAuth와 통합 된 REST WCF API를 광범위하게 검색했으며 적절한 리드를 찾지 못했습니다. http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx

이 예제를 사용하여 기존 Rest WCF와 통합했습니다. 서비스를 실행하면 "500 내부 서버 오류"가 발생하며 다른 시간에는 작업이 시간 초과됩니다.

다음은 문제를 일으키는 구현입니다.

class AppServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory 
{ 
    //<summary> 
    //Factory method called by WCF to create a <see cref="ServiceHost"/>. 
    //</summary> 
    //<param name="serviceType">The type of the service to be created.</param> 
    //<param name="baseAddresses">Collection of base addresses where the <see cref="ServiceHost"/> can listen.</param> 
    //<returns>An instance of <see cref="ServiceHost"/>.</returns> 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     try 
     { 
      Microsoft.ServiceModel.Web.WebServiceHost2 result = new Microsoft.ServiceModel.Web.WebServiceHost2(serviceType, true, baseAddresses); 

      result.Interceptors.Add(new OAuthChannel.OAuthInterceptor(DemoRESTOAuthService.OAuth.OAuthServicesLocator.Provider, DemoRESTOAuthService.OAuth.OAuthServicesLocator.AccessTokenRepository)); 

      return result; 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    } 
} 

나는 로그 파일을 사용하여 디버깅 난 그냥 말할 수 있어요 :

은 내가 SVC는에 공장 = "DemoRESTOAuthService.AppServiceHostFactory"를 아래와 같이 인터셉터를 추가하고 참조했다 OAuthChannel 어셈블리의 OAuthInterceptor.cs에 예외가 throw됩니다. tracelog와 fiddler를 사용했지만 500 개의 내부 서버 오류 이외의 오류를 이해하는 데 도움이되지 않습니다.

public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (requestContext == null || requestContext.RequestMessage == null) 
     { 
      return; 
     } 

     Message request = requestContext.RequestMessage; 


     HttpRequestMessageProperty requestProperty = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 


     OAuthContext context = new OAuthContextBuilder().FromUri(requestProperty.Method, request.Headers.To); 


     try 
     { 
      _provider.AccessProtectedResourceRequest(context); 


      OAuthChannel.Models.AccessToken accessToken = _repository.GetToken(context.Token); 


      TokenPrincipal principal = new TokenPrincipal(
       new GenericIdentity(accessToken.UserName, "OAuth"), 
       accessToken.Roles, 
       accessToken); 

      InitializeSecurityContext(request, principal); 
     } 
     catch (OAuthException authEx) 
     { 
      XElement response = XElement.Load(new StringReader("<?xml version=\"1.0\" encoding=\"utf-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\" version=\"-//W3C//DTD XHTML 2.0//EN\" xml:lang=\"en\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.w3.org/1999/xhtml http://www.w3.org/MarkUp/SCHEMA/xhtml2.xsd\"><HEAD><TITLE>Request Error</TITLE></HEAD><BODY><DIV id=\"content\"><P class=\"heading1\"><B>" + HttpUtility.HtmlEncode(authEx.Report.ToString()) + "</B></P></DIV></BODY></html>")); 
      Message reply = Message.CreateMessage(MessageVersion.None, null, response); 
      HttpResponseMessageProperty responseProperty = new HttpResponseMessageProperty() { StatusCode = HttpStatusCode.Forbidden, StatusDescription = authEx.Report.ToString() }; 
      responseProperty.Headers[HttpResponseHeader.ContentType] = "text/html"; 
      reply.Properties[HttpResponseMessageProperty.Name] = responseProperty; 
      requestContext.Reply(reply); 

      requestContext = null; 
     } 
    } 

아무도 저에게 무슨 일이 일어나고 있는지에 대한 통찰력을 가지시겠습니까?

또는 다리가있는 3 가지 OAuth 공급자 구현을위한 다른 적절한 예, 도움말, 팁 또는 문서를 도와주세요. 나는 지난 1 주 동안이 문제로 문자 그대로 붙어 있습니다. 어떤 도움을 주셔서 감사합니다. 사전에

감사 당신은 이미 내장으로 OAuth2 인증 공급자가 ServiceStack 같은 프레임 워크를 사용하지 않는 이유는

+0

현재 코드에서 문제를 지적하기가 어렵습니다. 서비스 끝 자체에서 디버그 할 수 없다면 q. 당신이 벌써 끝내게 될지도 모르는 supposign이기 때문에 2 월 2 일에 부탁 받았다. 어쨌든 diff oauth 프로토콜 http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html 사이의 차이점을 아는 데 유용한 문서가 있으며 oauth에 대한 자세한 내용은 https : //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –

답변