2013-02-28 11 views
14

Potrzebuję pomocy w integracji warstwy uwierzytelniania OAuth2.0 z usługą REST za pomocą szablonu aplikacji usługi WCF VS 2012 w języku C#. Ta funkcja WCF musi wystawiać tokeny w celu autoryzacji i uwierzytelnienia usługi przed umożliwieniem klientowi (konsumentowi) dostępu do jego zasobów. Na tym, na co patrzę, jest uwierzytelnianie trzyetapowe. Podobnie jak implementacja Twittera, LinkedIn, Google OAuth.OAuth 2.0 zintegrowany z usługą REST Usługa WCF Service

Przeszukałem internet w poszukiwaniu interfejsu API REST WCF zintegrowanego z OAuth i nie natrafiłem na żadną odpowiednią pomoc, która mi pomaga. Spojrzałem na stary przykład: http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx

Użyłem tego przykładu do integracji z istniejącym WCF. Po uruchomieniu usługi otrzymuję komunikat "Błąd wewnętrzny serwera wewnętrznego 500" i czasy, kiedy operacja się kończy.

Oto implementacja, która powoduje problemy.

musiałem dodać przechwytywacza jak poniżej i odwołuje się .svc fabryczne = „DemoRESTOAuthService.AppServiceHostFactory”:

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; 
     } 
    } 
} 

Kiedy debugowania przy użyciu pliku dziennika, po prostu jestem w stanie powiedzieć, że wyjątek jest zgłaszany w OAuthInterceptor.cs zespołu OAuthChannel. Użyłem traceloga i skrzypka, ale nie mam zbyt wiele pomocy w zrozumieniu błędu, poza 500 wewnętrznym błędem serwera.

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; 
     } 
    } 

Czy ktoś tam może mi pomóc wgląd w to, co się dzieje?

Czy możesz mi pomóc z innymi odpowiednimi przykładami, wskazówkami, wskazówkami lub dokumentacją dla trójstronnej implementacji dostawcy OAuth Provider. Dosłownie utknąłem z tym problemem przez miniony tydzień. Każda pomoc jest doceniana.

góry dzięki

+0

Jest dość trudno wskazać problem z aktualnym kodem, chyba że możemy debugować na samym końcu usługi, q. został zapytany w dniu 28 lutego, więc jestem supposign już może być zrobione. W każdym razie Oto dobry artykuł, aby poznać różnice między protokołami diff oauth http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html, a dowiesz się więcej o ohh stąd https: //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –

Odpowiedz