3

ASP.NET アプリケーションを実行しており、それに WCF Rest サービスを追加しました。ローカルおよびテスト環境にデプロイされた場合、これは正常に機能します。問題は、HTTPS のみである本番環境にデプロイするときです。

私はほとんどの回答をオンラインで検索して読み、非常に多くのことを試しました。すべて運が悪い。

これが私たちの簡単なコードです

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ReportingService
{
    public ReportingService()
    {
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }

    [OperationContract]
    [WebGet(UriTemplate = "get/{id}", ResponseFormat = WebMessageFormat.Json)]
    [PrincipalPermission(SecurityAction.Demand)]
    public List<RawReportTable> GetReport(string id)
    {
        ...
    }
}

Global.asax.cs には

RouteTable.Routes.Add(new ServiceRoute("api/reporting", new WebServiceHostFactory(), typeof(ReportingService)));

web.config では、system.serviceModel に対して次のように定義されています。

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="api" helpEnabled="true" automaticFormatSelectionEnabled="true" maxBufferSize="500000" maxReceivedMessageSize="500000">          
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="Transport" />
    </standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>

<behaviors>
  <endpointBehaviors>
    <behavior name="api">
      <webHttp />
    </behavior>
  </endpointBehaviors>

  <serviceBehaviors>
    <behavior name="">
      <serviceCredentials>
          <serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" findValue="d5 85 5b 37 89 47 6f 89 71 5b b7 5d 87 6f 2e e5 24 aa 57 b6" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

<services>
  <service name="ReportingService">
    <endpoint address="api/reporting" behaviorConfiguration="api" binding="webHttpBinding" bindingConfiguration="webBinding" contract="WayfinderFM.Service.api.ReportingService" />
  </service>
</services>

<bindings>
  <webHttpBinding>
    <binding name="webBinding">
      <security mode="Transport" />
    </binding>
  </webHttpBinding>
</bindings>

このセットアップでは、次のエラーが発生します。 リクエスト エラー: サーバーでリクエストの処理中にエラーが発生しました。詳細については、サーバー ログを参照してください。

ルーティングに登録されているため、構成にサービス/エンドポイントのものはもう必要ないと思いました (そしていくつかの例が示しています)。

その部分を削除しても、同じエラーが発生します。私は多くの異なる構成を試しましたが、すべてうまくいきませんでした。

奇妙なことは、 /api/reporting/help が実際に表示されることです。どのサービスも利用できません。

誰でも何か考えがありますか?私はそれが私が見逃した単純なものであることを願っています。

皆さんありがとう

編集

[PrincipalPermission(SecurityAction.Demand)] に関係していると思います。これを使用して、ユーザーが認証され、トークンにアクセスできることを確認します。WCF サービスが SSL に移行されると、PrincipalPermission.Demand() が失敗することがわかりましたが、残念ながらそれに対する回答はありません。

4

1 に答える 1

6

自分の質問に答えるのが嫌いですが、Rajesh のメッセージを読んだ後、エラーをさらに調べました。私の編集によると、それは PrincipalPermission 属性に関連していました。それを削除すると、コードが実行され、認証に失敗しました。

インターネットの検索に戻ると、http://forums.silverlight.net/t/34954.aspx/1が見つかりました。

serviceBehaviours に追加しました。だから、それは

<serviceBehaviors>
    <behavior name="">
        <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
        <serviceAuthorization principalPermissionMode="None"/>
    </behavior>
</serviceBehaviors>

これで機能し、認証されていない限り、サービスを呼び出して拒否される可能性があります。

うまくいけば、これはこの問題で他の誰かを助ける

于 2012-06-27T00:25:05.457 に答える