2011-01-26 17 views
0

Webサーバー上でホストされているアプリケーションによって呼び出されるWCFサービスがあります(短期的には単一のWebサーバーのみが必要なため、スケーラビリティは無視されます)。問題)公開中のWCFの保護MVC2 App

Webサーバーは公開Webサイトを提供します。 example.com

WCFサービスは、とりわけ、ジョブを実行し、Webモデルでサポートされていない特定の管理機能、たとえば長時間実行されているデータベース操作を提供します。

WCFサービスは、互換モードを使用してAsp.Net http(s)パイプラインを利用するため、Webサイト内でホストする必要があります。具体的には、サービスは電子メールを生成し、電子メールはMVCを使用してテンプレート化されます。これの副作用の1つは、呼び出しで公開されているホスト名(例:https://example.com/JobService.svc)を使用する必要があるため、電子メール内のリンクがlocalhostなどではなくexample.comを指していることです。

明らかに、私はWCFサービスを保護したいと思っているので、一般の人々がジョブ/管理タスクを開始できないようにしたいと思います。

Asp.net httpパイプラインを使用しているため、バインディングのためにnet.tcpなどとは対照的にhttpsしか使用できません。

私は、適切なホスト名を使用できるように公的にアクセス可能なIPアドレスにバインドする必要があり(誰かがこれを回避する方法を知っている場合を除き?)

サーバがないように私は、Kerberos/NTLMを使用することはできません

The SSL settings for the service 'SslRequireCert' does not match those of the IIS 'None'. 

NBを:私はかなり自体はHTTPSのみを経由して提供されるウェブサイトとしてこれを理解していないドメインに、それは文句として

私は、証明書を使用することはできません(とNTLMはとにかく弱いです)。 httpはhttps経由で同じページにリダイレクトします。

(興味深いのは、mexはhttps経由で提供されますが、WSDL内のURLはhttpを使用していますが、これはTLSを正しく設定できないという副作用であると仮定しています私のサービスだから、httpsでも応答してもhttpだと思っている)

私のサービスをどうやって保護するかについてのアイデアは不足しています。もちろん、サービス自体からリクエストを調べて、現在のサーバーで使用されているIPから来ているかどうかを判断できますが、これは非常に厄介であり、私は効果的に専門家の作業を無視して、場所 - 始めるにはとても良い場所ではありません。

誰でもこのサービスへのアクセスをローカルマシンのプロセスに限定する方法を提案できますか?

私は現在の設定を以下に添付しました。

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="WebJobServiceHTTPBinding" openTimeout="00:10:00" 
       sendTimeout="00:10:00"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Certificate" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" 
           aspNetCompatibilityEnabled="true"> 
     <serviceActivations> 
      <add relativeAddress="WebJob.svc" 
       service="MyApp.WebJobService" 
       factory="MyApp.WCFDIServiceHostFactory" /> 
     </serviceActivations> 
    </serviceHostingEnvironment> 
    <services> 
     <service behaviorConfiguration="WebJobServiceBehavior" name="MyApp.WebJobService"> 
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="WebJobServiceHTTPBinding" 
       name="HTTPEndpoint" contract="MyApp.JobService.Common.IWebJobService" /> 
     </service> 
    </services> 
    <standardEndpoints> 
     <mexEndpoint> 
      <standardEndpoint name="WebJobServiceMex" /> 
     </mexEndpoint> 
    </standardEndpoints> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="WebJobServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
       <serviceCredentials> 
        <serviceCertificate findValue="[Thumbprint of x509 cert used by website for SSL]" 
         storeName="Root" x509FindType="FindByThumbprint" /> 
       </serviceCredentials> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

答えて

0

結局私は自分の認証システムを実装することを余儀なくされました。これは、認証が暗黙の認可(すなわち、許可レベルなし)として比較的簡単でした。つまり、私はまだ解決策に不満があり、別のオプションが提示されればそれを変更します。

0

を(これは、現在私に上記の証明書エラーを与えている)、「誰もがローカルマシン上のプロセスに、このサービスへのアクセスを制限する方法を提案することはできますか?」

IISの別のWebサイトでサービスを実行していない場合は、実行してください。

IISでサービスを内部ネットワークのIPアドレスにバインドすると、内部LANクライアントはサービスにアクセスできますが、外部クライアントはアクセスできなくなります。

もう1つのバインドオプションは、内部クライアントからのアクセスのみを許可するために、ファイアウォールで開いていないポートにバインドすることです。さらに、ファイアウォールで開いていないポートにバインドすると、が内部LAN IPにバインドされます。

また、IPアドレス127.0.0.1にバインドすることもできます。

+0

あなたの答えをありがとうが、私が誤解しない限り、彼らは私の問題を解決しません。私は別のウェブサイトを使用することはできません - 私はあなたのウェブサイト上のユーザーの行動によって生成されたものと同じメールを私のWCFサービスから送ることができる必要があります。私はDRYではないので、各電子メールを2回定義する必要はありません。 127.0.0.1へのバインドは、私の質問(127.0.0.1 = localhost)で説明されている理由では機能しません。 – Basic

関連する問題