0

セッションをサポートするために、JSON を要求および応答形式として使用する WCF サービスを使用することは可能ですか?

現在、JSON 形式で WCF サーバーと通信し、呼び出しごとに認証しているアプリをセキュリティで保護する必要があります。

ログイン時にのみ認証し、セッションで残りのリクエストを処理したいのですが、そのようなサービスを作成しようとすると、バインディングを wsHttpBinding または netTCPBinding に変更する必要があり、その瞬間に、サーバーが JSON リクエストを受け入れなくなりました。ただし、「サービス参照の追加」ツールを使用するだけで、C# で記述されたテスト クライアントからの要求を受け入れます。

fiddler を使用すると、C# クライアントが非常に肥大化した XML を介してサービスと通信していることがわかりました。

これが私のweb.configです:

<?xml version="1.0"?>

<configuration>

  <system.web>
    <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral,     PublicKeyToken=b77a5cxxxxxxe089"/>
      </assemblies>
    </compilation>
    <!--
          The <authentication> section enables configuration 
          of the security authentication mode used by 
          ASP.NET to identify an incoming user. 
        -->
    <authentication mode="Windows"/>
    <!--
           The <customErrors> section enables configuration 
           of what to do if/when an unhandled error occurs 
           during the execution of a request. Specifically, 
           it enables developers to configure html error pages 
           to be displayed in place of a error stack trace.

           <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
             <error statusCode="403" redirect="NoAccess.htm" />
             <error statusCode="404" redirect="FileNotFound.htm" />
           </customErrors>
        -->
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
  </system.web>
  <!-- 
        The system.webServer section is required for running ASP.NET AJAX under Internet
        Information Services 7.0.  It is not necessary for previous version of IIS.
    -->
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MobiServiceLibrary.MobiServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <!--<endpointBehaviors>
        <behavior name="MobiServiceLibrary.MobiServiceBehavior">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"     automaticFormatSelectionEnabled="true"/>
        </behavior>
      </endpointBehaviors>-->
    </behaviors>
    <services>
      <service behaviorConfiguration="MobiServiceLibrary.MobiServiceBehavior" name="MobiServiceLibrary.MobiService">
        <endpoint address="" binding="wsHttpBinding" contract="MobiServiceLibrary.IMobiService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true"     minFreeMemoryPercentageToActivateService="1">
        </serviceHostingEnvironment>-->
  </system.serviceModel>
</configuration>

マイログイン「契約」:

[ServiceContract(SessionMode = SessionMode.Required)]
public partial interface IMobiService
{
    [OperationContract(IsInitiating=true)]
    [WebInvoke(Method = "POST", UriTemplate = "/Login", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json)]
    userData login(string pUserName, string pPassword, string pDeviceType);
}

私のログイン「実装」:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,AddressFilterMode=AddressFilterMode.Any)]
public partial class MobiService : IMobiService
{
    public userData login(string pUserName, string pPassword, string pDeviceType)
    {
        //Do Login
    }
}
4

2 に答える 2

0

私は自分自身の質問に答えようとしますが、まだ間違っている場合は遠慮なく指摘してください。

さらにグーグルを行った後、これを見つけました: BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

これが、JSON 形式でセッションフル サービスを実行する際に問題が発生した理由を説明しています。バインディングが主な問題のようです: webHttpBindingは純粋な RestFul サービスに使用され、JSON でうまく機能し、サービスとクライアントの間で要求と応答のラッピングがほとんどまたはまったくなく、呼び出しごとの再認証が行われます。おすすめされた。 basicHttpBindingwsHttpBindingはどちらも、サービスに機能とセキュリティを追加するために使用されます (wsHttpBinding は単純に新しく、より多くの機能を備えています)。私の理解が正しければ、basic-binding と ws-binding の両方が追加機能をサポートするために SOAP+XML に依存しており、これらの機能の 1 つが session-supportです。

したがって、basicHttpBinding および wsHttpBinding サービスは定義上 RESTful ではなく、webHttpBinding サービスはセッションをサポートしません。

だから私のオプションは次のとおりです。

  1. webHttpBinding に固執し、呼び出しごとに認証します (リプレイ攻撃の影響を受けやすい、http://en.wikipedia.org/wiki/Replay_attack )
  2. webHttpBinding に固執し、DB サーバー側を使用して独自のバージョンの「セッション」を実装します。(できれば、RSA などの非対称暗号化を実装することによって)
  3. クライアントを変更して SOAP+XML をサポートする

現時点では、オプション番号 2 に傾いています。

コメント、アドバイス、および/または批判など、これをよりよく理解するのに役立つものは何でも感謝します.

よろしく!

于 2013-03-18T09:29:30.793 に答える
0

あなたの wcf サービスは scriptService としてマークされていますか?

この WCFService は IIS サーバーでホストされていますか、それともサービス ホストだけでホストされていますか。サービス ホストが認証を管理する方法がわかりません。IISで動作することを知っています

アプリからログイン サービスを呼び出します。成功すると、IIS によってセッション Cookie が作成され、アプリの応答から取得できます。その Cookie をキャッシュし、アプリから行う後続のすべてのサービス リクエストに設定します

于 2013-03-15T13:55:45.733 に答える