当客户端可以是Javascript客户端时的WCF服务安全性

时间:2012-07-26 05:07:33

标签: javascript .net wcf rest wcf-security

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

据我所知,WCF支持使用传输和邮件安全加密数据。但是WCF仍然不安全,因为任何人都可以使用该服务(缺少身份验证)。只有“来回”的数据通过频道加密。这还不够。因此,我们引入了相互身份验证并选择了证书作为cridentials。客户端需要做的是:除了所有SOAP请求,他还应发送有效证书(客户端cridential包含公共和私有密钥,并由WCF管理员发布),这是由我的服务器信任的CA发布。

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

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

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

我知道JavaScript不支持Message Security,它只支持Transport Security。我不在乎如何通过网络加密数据。我关心客户端如何通过我的WCF服务进行身份验证。

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您已经在为网站使用表单身份验证,则可以通过启用AspNetCompatibilityRequirementsMode为Required来利用ASP.NET pipline检查FormAuthentication Cookie。有关详细信息,请参阅此SO thread

如果您的服务是独立服务,并且它只是由您无法控制的不同客户端使用,那么您可以使用oauth身份验证,其中将存在将与所有经过身份验证的客户端共享的使用者密钥。调用者将使用此密钥签署一些信息,服务器也会使用相同的密钥对其进行签名,然后进行比较。有关实施细节,请查看此excellent article

答案 1 :(得分:0)

哦,我明白了......我正在研究tou即OAuth建议的组件上的R& D ...到目前为止我能做的是:通过SSL公开webHttpBinding端点,我的javascript客户端可以调用SSL使用$ Ajax使用JSONP安全服务...这意味着频道已加密..现在我只需要在WCF中应用OAuth ...你能指导一下Javascript客户端如何理解OAuth吗?我的意思是我从这里下载了OAuth的服务器代码(http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs)但是如何使用javascript调用这样的服务?我在这一点上做了R& D,并且如果我得到任何反对者,我会发布。

这是我的REST WCF over SSL配置希望它可以帮助某人:

<?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>"); }
            });