C#의 VS 2012 WCF 서비스 응용 프로그램 템플릿을 사용하여 REST 서비스와 OAuth2.0 인증 계층을 통합하는 데 도움이 필요합니다. 이 WCF는 클라이언트 (컨슈머)가 리소스에 액세스 할 수있게하기 전에 서비스의 인증 및 인증을 위해 토큰을 발행해야합니다. 세 다리가있는 인증은 내가 바라는 것입니다. 트위터, LinkedIn, Google OAuth 구현과 비슷합니다.REST WCF 서비스 응용 프로그램과 통합 된 OAuth 2.0
인터넷에서 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 내부 서버 오류"가 발생하며 다른 시간에는 작업이 시간 초과됩니다.
다음은 문제를 일으키는 구현입니다.
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;
}
}
}
나는 로그 파일을 사용하여 디버깅 난 그냥 말할 수 있어요 :
은 내가 SVC는에 공장 = "DemoRESTOAuthService.AppServiceHostFactory"를 아래와 같이 인터셉터를 추가하고 참조했다 OAuthChannel 어셈블리의 OAuthInterceptor.cs에 예외가 throw됩니다. 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 가지 OAuth 공급자 구현을위한 다른 적절한 예, 도움말, 팁 또는 문서를 도와주세요. 나는 지난 1 주 동안이 문제로 문자 그대로 붙어 있습니다. 어떤 도움을 주셔서 감사합니다. 사전에
감사 당신은 이미 내장으로 OAuth2 인증 공급자가 ServiceStack 같은 프레임 워크를 사용하지 않는 이유는
현재 코드에서 문제를 지적하기가 어렵습니다. 서비스 끝 자체에서 디버그 할 수 없다면 q. 당신이 벌써 끝내게 될지도 모르는 supposign이기 때문에 2 월 2 일에 부탁 받았다. 어쨌든 diff oauth 프로토콜 http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html 사이의 차이점을 아는 데 유용한 문서가 있으며 oauth에 대한 자세한 내용은 https : //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –