2

次のように定義されたWCFサービスがあります。

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Service
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string HelloWorld()
    {
        return "Hello World";
    }
}

私の Web.Config ファイル:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="webHttpBehavior">
                <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true"/>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="Service">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="Service" behaviorConfiguration="webHttpBehavior"/>
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
</configuration>

WCF サービスで ASP .Net セッション変数にアクセスできるようにしたいのですが、WCF サービスが JSONP データを返すようにしたいのですが、この単純なサービスでも、../Service.svc/HelloWorld を参照すると、 400 Bad Request エラー。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

5

JSONP、ASP.NET 互換性、および認証済みユーザーの組み合わせは、このMicrosoft フォーラムではサポートされていないようです。

フォーラムのモデレーターによると、3 つのうちの 1 つを無効にする必要があります。

おそらくあなたが望んでいた答えではありませんが、司会者の説明は非常に適切で、いくつかの提案を提供しています.

お役に立てれば。幸運を!

于 2012-09-19T21:22:38.970 に答える
0

これはすでに回答されていることを認識していますが、(セキュリティの観点から推奨されているかどうかはわかりませんが) webHttpBinding によって行われているチェックに合格するのに十分早い段階でリクエストを「認証解除」することは可能です。

要点は、認証されていないユーザーがサービスにアクセスした場合に表示されるものを模倣する名前またはタイプのないHttpContext.Current.User新しいGenericPrincipalビルドになるように設定するGenericIdentityことです-webHttpBindingが「認証されていないJSONP呼び出し」を実行するまでに、リクエストは認証されていないユーザーのコンテキストで行われます。

注:これがセキュリティに影響を与えるかどうかはわかりません。頭に浮かんだのは、認証されたユーザーがいる場合、ユーザーのセッション状態がサービスで引き続き利用できるということです。している.

いくつかの場所でこれを行うことができます

  • Application.AuthenticateRequest イベントをフックして、リクエスト URL でフィルタリングする
  • カスタム WCF メッセージ インスペクターを使用する

メッセージ インスペクターと動作要素の例 (同じクラス、非常に自己責任で使用):

using System;
using System.Security.Principal;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Threading;
using System.Web;

namespace MyNamespace
{
    public class ForceAnonymousEndpointBehavior : BehaviorExtensionElement, IDispatchMessageInspector, IEndpointBehavior
    {
        public override Type BehaviorType
        {
            get { return typeof(ForceAnonymousEndpointBehavior); }
        }

        protected override object CreateBehavior()
        {
            return new ForceAnonymousEndpointBehavior();
        }

        object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            HttpContext.Current.User = Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("", ""), null);
            return null;
        }

        void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
        {

        }

        void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new ForceAnonymousEndpointBehavior());
        }

        void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {

        }

        void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {

        }

        void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
        {

        }
    }
}

次に、web.config で動作拡張を登録します (system.serviceModel 要素内):

<extensions>
  <behaviorExtensions>
    <add name="ForceAnonymous" type="MyNamespace.ForceAnonymousEndpointBehavior, MyAssembly" />
  </behaviorExtensions>
</extensions>

問題の endpointBehavior に動作を追加します (再び system.serviceModel の下):

<behaviors>
  <endpointBehaviors>
    <behavior name="jsonpBehavior">
      <ForceAnonymous />
    </behavior>
  </endpointBehaviors>
</behaviors>

behaviorConfiguration...そして、上記で使用した動作名と一致するように属性を設定することにより、エンドポイントの動作がサービスのエンドポイント宣言で呼び出されるようにします。

于 2013-10-01T11:07:17.273 に答える