2

如何保护 Javascript 客户端可以使用的 WCF 服务?对此有任何特定的安全模型吗?

我的理解是 WCF 支持使用传输和消息安全对数据进行有线加密。但是 WCF 仍然不完全安全,因为任何人都可以使用该服务(缺少身份验证)。只有“来回”移动的数据在通道上被加密。这还不够。因此,我们引入了相互身份验证并选择了证书作为凭证。客户端需要做的是:连同所有 SOAP 请求,他应该发送一个有效的证书(客户端凭证也包含公共和私人密钥,并且由 WCF 管理员颁发)这是由我的服务器信任的 CA 颁发。

我们使用 basicHttpBinding 因为我们的客户端可以是 Javascript/Ipad/.Net/DBL 客户端。我们可以使用 .Net/SOAPUI/JAVA 客户端来使用这些服务。所以我们很擅长这种方法。

但是今天在分析过程中,我们发现 JavaScript 客户端无法使用我们的服务,因为它不支持相互身份验证(如果我错了,请纠正我)。即使它支持相互身份验证并向服务器发布有效证书,我们也无法让所有客户端(Web 浏览器)都提供客户端证书,因为它还包含一个公钥和一个私钥(请注意 PRIVATE KEY AS WELL!!)和我的服务器盲目信任。

现在我有点困惑。有人可以建议一些 JavaScript 支持的安全模型,而不会影响任何安全性。类似 RESTful WCF 的东西。

我知道 JavaScript 不支持消息安全,它只支持传输安全。我不在乎数据是如何通过网络加密的。我关心的是客户端如何通过我的 WCF 服务进行身份验证。

非常感谢

4

2 回答 2

2

如果您已经在为您的网站使用表单身份验证,则可以利用 ASP.NET 管道通过将 AspNetCompatibilityRequirementsMode 启用为必需来检查 FormAuthentication Cookie。更多细节可以在这个SO 线程中找到

如果您的服务是独立服务并且它只是由您无法控制的不同客户端使用,那么您可以使用 oauth 身份验证,其中将有一个消费者密钥,该密钥将共享给所有经过身份验证的客户端。调用者将使用此密钥对一些信息进行签名,服务器也将使用相同的密钥对其进行签名,然后进行比较。实现细节请看这篇优秀的文章

于 2012-07-26T05:18:52.760 回答
0

哦,我明白了...我正在对 tou ie OAuth 建议的组件进行研发...到目前为止我能做的是:通过 SSL 公开一个 webHttpBinding 端点,我的 javascript 客户端可以使用 $Ajax 调用 SSL Secure 服务使用 JSONP ......这意味着通道是加密的......现在我需要的是在 WCF 中应用 OAuth......你能指导我 Javascript 客户端如何理解 OAuth 吗?我的意思是我从这里(http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs)下载了用于 OAuth 的服务器代码,但是如何使用 javascript 调用此类服务​​?在这一点上我正在做研发,如果我得到任何答案,我会发布。

这是我通过 SSL 配置的 REST WCF 希望对某人有所帮助:

<?xml version="1.0"?>

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="jsonpSsl" crossDomainScriptAccessEnabled="true">
          <security mode="Transport" />
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="JsonServiceBehaviors">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpsGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="WCFTransportSecurity.TransportSecurityService" behaviorConfiguration="JsonServiceBehaviors">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="jsonpSsl" contract="WCFTransportSecurity.ITransportSecurityService" behaviorConfiguration="webHttpBehavior"/>
      </service>
    </services>
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

这是对服务的 JQuery AJAX 调用(希望对某人有所帮助)

 $.ajax(
            {
                type: "GET",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "jsonp",
                url: "https://localhost/WCFTransportSecurity/TransportSecurityService.svc/getdata/" + $("#TextBox1").val(),
                success: function (a) { $("#lblResponse").text(a); },
                error: function (a) {$("#lblResponse").html("Error while Processing: Error Code: " + a.status + "<br/>and Error Message: <span style='color:red'>" + a.statusText + "</span>"); }
            });
于 2012-07-27T11:23:00.540 回答