Potrzebuję pomocy w integracji warstwy uwierzytelniania OAuth2.0 z usługą REST za pomocą szablonu aplikacji usługi WCF VS 2012 w języku C#. Ta funkcja WCF musi wystawiać tokeny w celu autoryzacji i uwierzytelnienia usługi przed umożliwieniem klientowi (konsumentowi) dostępu do jego zasobów. Na tym, na co patrzę, jest uwierzytelnianie trzyetapowe. Podobnie jak implementacja Twittera, LinkedIn, Google OAuth.OAuth 2.0 zintegrowany z usługą REST Usługa WCF Service
Przeszukałem internet w poszukiwaniu interfejsu API REST WCF zintegrowanego z OAuth i nie natrafiłem na żadną odpowiednią pomoc, która mi pomaga. Spojrzałem na stary przykład: http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx
Użyłem tego przykładu do integracji z istniejącym WCF. Po uruchomieniu usługi otrzymuję komunikat "Błąd wewnętrzny serwera wewnętrznego 500" i czasy, kiedy operacja się kończy.
Oto implementacja, która powoduje problemy.
musiałem dodać przechwytywacza jak poniżej i odwołuje się .svc fabryczne = „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;
}
}
}
Kiedy debugowania przy użyciu pliku dziennika, po prostu jestem w stanie powiedzieć, że wyjątek jest zgłaszany w OAuthInterceptor.cs zespołu OAuthChannel. Użyłem traceloga i skrzypka, ale nie mam zbyt wiele pomocy w zrozumieniu błędu, poza 500 wewnętrznym błędem serwera.
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;
}
}
Czy ktoś tam może mi pomóc wgląd w to, co się dzieje?
Czy możesz mi pomóc z innymi odpowiednimi przykładami, wskazówkami, wskazówkami lub dokumentacją dla trójstronnej implementacji dostawcy OAuth Provider. Dosłownie utknąłem z tym problemem przez miniony tydzień. Każda pomoc jest doceniana.
góry dzięki
Jest dość trudno wskazać problem z aktualnym kodem, chyba że możemy debugować na samym końcu usługi, q. został zapytany w dniu 28 lutego, więc jestem supposign już może być zrobione. W każdym razie Oto dobry artykuł, aby poznać różnice między protokołami diff oauth http://blog.nerdbank.net/2011/06/what-is-2-legged-oauth.html, a dowiesz się więcej o ohh stąd https: //github.com/DotNetOpenAuth/DotNetOpenAuth.Samples –