2

同一オリジン ポリシーの欠点の 1 つは、異なるポートまたはサブドメインをサポートしていないことです。その結果、services.site.com のようなサブ ドメインでサービスをホストする場合、JSONP を使用せずに www.site.com からサービスを呼び出すことはできません。

特定のオリジンからのリクエストのみを受け入れるように WCF サービスを構成する方法はありますか?

例:

$(document).ready(function () {
    $("#Button").click(function () {
        $.getJSON("http://services.site.com/service.svc/myService?callback=?", function (data) {
            var jObj = $.parseJSON(data);
            $("#Result").html(jObj.MyValue);
        });
    });
});

これが www.site.com から呼び出された場合、私はそれを機能させたいと思います。しかし、www.example.com のような別のサイトがそれを呼び出した場合、WCF サービスでそれをブロックしたいと思います。

web.config ファイルを次のように構成しようとしました。

<identity>
  <dns value="www.example.com"/>
</identity>

しかし、www.site.com から電話をかけてみたところ、問題なく動作しました。これは、JSONP が正しいコールバック値を返すように、crossDomainScriptAccessEnabled を true に設定したためだと思います。WCF を使用してまだ数日しか経っていません。

前もって感謝します。

4

1 に答える 1

0

ID はクライアントへのサービスを識別するために使用されるため、サービスへの呼び出しを防止するのには役立ちません。

これが無料のサービスである場合、クライアントがどこから来たかに関係なく、クライアントの認証と承認は必要ありません。

一方、サービスを保護したい場合は、呼び出し元に関係なく、クライアントをサービスに対して認証/承認する必要があります。このトピックに関する多くのリソースがあります。

.NET Framework 4 用の MSDN Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル

SO WCF サービスの保護

MSDN WCF セキュリティ リソース

WCF サービスの保護: ASP.NET メンバーシップとロール プロバイダーの使用

メソッド呼び出しで次のようにリモート エンドポイントを取得するか、広大なWCF 拡張チェーンのどこかでそれをインターセプトすることにより、ブルート フォースを使用してクライアント IP を取得することができます (ほとんどの場合、これは機能します)。

var messageProperty = OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

その後、リバース DNS ルックアップを実行できますが、常に機能するとは限りません (プロキシ、NAT など)。

もう 1 つの簡単なポイントとして、JSON 呼び出しで GET を使用すると、JSON ハイジャックが発生する可能性があります

于 2012-05-08T07:56:47.987 に答える