OAuth 2.0与REST WCF服务应用程序集成

本文关键字:服务 应用程序 集成 WCF REST OAuth | 更新日期: 2023-09-27 18:01:45

我需要在c#中使用VS 2012 WCF服务应用程序模板集成认证层OAuth2.0与REST服务的帮助。在允许客户端(消费者)访问其任何资源之前,该WCF需要为服务的授权和身份验证发出令牌。三条腿的认证就是我要找的。很像Twitter, LinkedIn, Google OAuth的实现。

已经在互联网上广泛搜索了与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内部服务器错误",其他时候操作只是超时。

这是导致问题的实现。

我必须添加拦截器如下所示,并在.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;
        }
    }

有谁能帮我了解一下发生了什么事吗?

或者你能帮我提供任何其他合适的例子,指针,提示或文档,为三条腿的OAuth提供程序实现。过去的一个星期我真的被这个问题困住了。如有任何帮助,不胜感激。

Thanks in advance

OAuth 2.0与REST WCF服务应用程序集成

为什么不使用ServiceStack这样已经构建了OAuth2认证提供者的框架呢?https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization

或者如果你不想使用整个堆栈,看看他们的代码,看看它与你自己的有什么不同。