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