2013-02-28 22 views
14

Ich benötige Hilfe bei der Integration einer Authentifizierungsschicht OAuth2.0 mit einem REST-Dienst, der die VS 2012 WCF-Dienstanwendungsvorlage in C# verwendet. Diese WCF muss Tokens für die Autorisierung und Authentifizierung des Dienstes ausgeben, bevor der Client (Consumer) auf seine Ressourcen zugreifen darf. Dreibeinige Authentifizierung ist, was ich betrachte. Ähnlich wie die Twitter-, LinkedIn- und Google OAuth-Implementierung.OAuth 2.0 integriert mit REST WCF-Dienstanwendung

Habe das Internet ausgiebig nach einer REST WCF API gesucht, die in OAuth integriert ist und auf keine geeigneten Leads gestoßen ist, die mir helfen. Ich habe ein altes Beispiel betrachtet http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx

Ich habe dieses Beispiel verwendet, um mit einem vorhandenen Rest WCF zu integrieren. Wenn ich den Dienst ausführe, bekomme ich den "500 Internal Server Error" und manchmal kommt der Vorgang einfach mal raus.

Hier ist die Implementierung, die Probleme verursacht.

Ich hatte den Abfangjäger, wie unten und verweisen in der .svc Fabrik = „DemoRESTOAuthService.AppServiceHostFactory“ hinzuzufügen:

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

Wenn ich debug mit einer Log-Datei, ich, dass ein nur in der Lage bin zu sagen, Ausnahme wird in der OAuthInterceptor.cs der OAuthChannel-Assembly ausgelöst. Ich habe tracelog und fiddler benutzt, aber ich bekomme nicht viel Hilfe, um den Fehler zu verstehen, abgesehen von 500 internen Serverfehlern.

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

Kann jemand da draußen bitte helfen Sie mir mit einem Einblick, was vor sich geht?

Oder können Sie mir bitte mit anderen geeigneten Beispielen, Tipps, Tipps oder Dokumentationen für dreibeinige OAuth Provider-Implementierung helfen. Ich stecke buchstäblich seit einer Woche mit diesem Thema fest. Jede Hilfe wird geschätzt.

Vielen Dank im Voraus

+0

Es ist ziemlich schwierig, ein Problem mit dem aktuellen Code aufzuzeigen, es sei denn, wir könnten am Dienst selbst debuggen, der q. wurde am Feb 28 gefragt, also nehme ich an, du könntest schon fertig sein. Anyways Hier ist ein guter Artikel, um den Unterschied zwischen diff oauth Protokolle kennen http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html und Sie können mehr über oauth von hier lernen https: //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –

Antwort