2

Javascript クライアントが使用できる WCF サービスを保護する方法は? このための特定のセキュリティ モデルはありますか?

私が理解しているのは、トランスポートとメッセージのセキュリティを使用したワイヤ上のデータの WCF サポート暗号化です。しかし、誰でもサービスを利用できるため、WCF はまだ完全に安全ではありません (認証がありません)。「行き来」するデータのみがチャネル上で暗号化されます。これは十分ではありません。そのため、相互認証を導入し、資格情報として証明書を選択しました。クライアントが行う必要があるのは、すべての SOAP 要求と共に、有効な証明書 (クライアント資格情報にはパブリック キーとプライベート キーも含まれ、WCF 管理者によって発行されたもの) を送信する必要があることです。私のサーバーが信頼するCAによって発行されました。

クライアントが Javascript/Ipad/.Net/DBL クライアントになる可能性があるため、basicHttpBinding を使用しています。.Net/SOAPUI/JAVA クライアントを使用して、このようなサービスを利用できます。したがって、このアプローチはうまくいきました。

しかし、今日の分析中に、相互認証をサポートしていないため、JavaScript クライアントがサービスを利用できないことがわかりました (間違っていたら訂正してください)。相互認証をサポートし、有効な証明書をサーバーに投稿したとしても、すべてのクライアント (Web ブラウザー) にクライアント証明書を提供する余裕はありません。これには、パブリック キーとプライベート キーも含まれているためです (PRIVATE KEY AS WELL にも注意してください!!)。私のサーバーは盲目的に信頼しています。

今、私は少し混乱しています。セキュリティを損なうことなく、JavaScript でサポートされているセキュリティ モデルを誰かが提案できますか? RESTful WCF のようなもの。

JavaScript は Message Security をサポートしておらず、Transport Security のみをサポートしていることを理解しています。データがネットワーク上でどのように暗号化されるかは気にしません。クライアントが WCF サービスによって認証される方法が気になります。

どうもありがとう

4

2 に答える 2

2

Web サイトで既にフォーム認証を使用している場合は、AspNetCompatibilityRequirementsMode を Required に有効にすることで、ASP.NET パイプラインを利用して FormAuthentication Cookie を確認できます。詳細については、このSO スレッドを参照してください。

サービスがスタンドアロン サービスであり、制御できないさまざまなクライアントによって消費されるだけの場合は、すべての認証済みクライアントに共有されるコンシューマ シークレット キーがある oauth 認証を使用できます。呼び出し元はこのキーを使用していくつかの情報に署名し、サーバーも同じキーを使用して署名してから比較します。実装の詳細については、この優れた記事をご覧ください

于 2012-07-26T05:18:52.760 に答える
0

なるほど...tou、つまりOAuthによって提案されたコンポーネントの研究開発を行っています...これまでにできることは、SSLを介してwebHttpBindingエンドポイントを公開し、JavaScriptクライアントが$Ajaxを使用してSSLセキュアサービスを呼び出すことができることです。 JSONPを使用しています...これはチャネルが暗号化されていることを意味します。今必要なのはWCFにOAuthを適用することだけです...JavascriptクライアントがOAuthを理解する方法を教えてください。ここ(http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs)からOAuthのサーバーコードをダウンロードしていますが、JavaScriptを使用してそのようなサービスを呼び出す方法はありますか?私はこの点について研究開発を行っており、何か回答があれば投稿します。

これが私のRESTWCFoverSSL構成です。誰かに役立つことを願っています。

<?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 に答える