Мне нужна помощь в интеграции уровня аутентификации OAuth2.0 с помощью службы REST с использованием шаблона приложения VS 2012 WCF в С#. Этот WCF должен выдавать токены для авторизации и аутентификации службы, прежде чем позволить Клиенту (Потребителю) получить доступ к любому из своих ресурсов. То, что я просматриваю, - это трехногая аутентификация. Подобно Twitter, LinkedIn, Google OAuth.
Ищите в Интернете экстенсивно для REST WCF API, интегрированного с OAuth, и не сталкивайтесь с любыми подходящими выводами, которые мне помогают. Я посмотрел на старый пример http://weblogs.asp.net/cibrax/archive/2008/11/14/using-the-wcf-oauth-channel-with-an-ado-net-service.aspx
Я использовал этот пример для интеграции с существующим Rest WCF. Когда я запускаю службу, я получаю "Внутреннюю ошибку сервера 500", а в других случаях операция просто отключается.
Вот реализация, которая вызывает проблемы.
Мне пришлось добавить перехватчик, как показано ниже, и указав в .svc Factory= "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;
}
}
}
Когда я отлаживаю использование файла журнала, я просто могу сказать, что исключение выбрано в OAuthInterceptor.cs сборки OAuthChannel. Я использовал 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;
}
}
Кто-нибудь может помочь мне понять, что происходит?
Или вы можете помочь мне с любыми другими подходящими примерами, указателями, советами или документами для трехсторонней реализации поставщика OAuth. Я буквально застрял в этом вопросе в течение прошлой недели. Любая помощь приветствуется.
Заранее спасибо