2013-02-28 13 views
14

C#のVS 2012 WCF Serviceアプリケーションテンプレートを使用して、認証レイヤOAuth2.0とRESTサービスを統合する際に助けが必要です。このWCFは、クライアント(コンシューマ)がそのリソースにアクセスする前に、サービスの認可と認証のためのトークンを発行する必要があります。 3つの脚の認証は、私が見ているものです。 Twitter、LinkedIn、Google OAuthの実装とほとんど同じです。OAuth 2.0をREST WCFサービスアプリケーションと統合

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 Internal server error"が表示され、他の回の操作ではタイムアウトになります。

問題を引き起こしている実装を次に示します。

私は以下のようにインターセプタを追加する必要がありましたし、.SVC 工場=「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; 
     } 
    } 
} 

私は、ログファイルを使用してデバッグする場合、私はちょうどそれを伝えることができていますOAuthChannelアセンブリのOAuthInterceptor.csに例外がスローされます。私は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つのlegged OAuth Provider実装のための他の適切な例、ポインタ、ヒント、またはドキュメントを教えてください。私は文字通り過去1週間はこの問題に悩まされています。どんな助けもありがとうございます。事前に

おかげであなたは、このような構築済みのOAuth2認証プロバイダがあるServiceStackようなフレームワークを使用していないのはなぜ

+0

サービスエンドでデバッグできない限り、現在のコードで問題を指摘するのはかなり難しいです。私はあなたがすでにやっているかもしれないと思っているので、フェブ28で尋ねられました。とにかくここではdiff oauthプロトコルの違いを知る良い記事がありますhttp://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.htmlそしてoauthの詳細についてはhttps: //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –

答えて

関連する問題