2013-02-28 14 views
14

Ho bisogno di aiuto con l'integrazione di un livello di autenticazione OAuth2.0 con un servizio REST utilizzando il modello di applicazione servizio WCF VS 2012 in C#. Questa WCF deve emettere token per l'autorizzazione e l'autenticazione del servizio prima di consentire al Cliente (Consumatore) di accedere a una delle sue risorse. L'autenticazione a tre gambe è ciò che sto guardando. Proprio come l'implementazione di Twitter, LinkedIn, Google OAuth.OAuth 2.0 integrato con l'applicazione di servizio REST WCF

Ho cercato in Internet estesamente un'API WCF REST integrata con OAuth e non ho trovato nessun contatto adatto che mi stia aiutando. Ho esaminato un vecchio esempio http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx

Ho utilizzato questo esempio per l'integrazione con un WCF Rest esistente. Quando eseguo il servizio, ricevo il "500 Errore interno del server" e altre volte l'operazione è scaduta.

Ecco l'implementazione che sta causando problemi.

ho dovuto aggiungere l'intercettore come qui di seguito e riferimento nella .svc fabbrica = "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; 
     } 
    } 
} 

Quando ho Debug si utilizza un file di log, ho solo sono in grado di dire che un viene generata un'eccezione in OAuthInterceptor.cs dell'assembly OAuthChannel. Ho usato tracelog e fiddler, ma non mi viene molto d'aiuto capire l'errore, a parte 500 errori interni del server.

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

Qualcuno può aiutarmi a capire cosa sta succedendo?

Oppure puoi aiutarmi con altri esempi, suggerimenti, suggerimenti o documentazioni idonee per l'implementazione di provider OAuth a tre zampe. Sono letteralmente bloccato con questo problema da una settimana. Qualsiasi aiuto è apprezzato.

Grazie in anticipo

+0

È piuttosto difficile segnalare un problema con il codice corrente, a meno che non sia possibile eseguire il debug del servizio stesso, The q. è stato chiesto il 28 febbraio quindi suppongo che potresti già averlo fatto. Anyways Ecco un buon articolo per conoscere il diff tra i protocolli diff oauth http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html e si può imparare di più su oauth da qui https: //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –

risposta