11

クロスサイト スクリプティング リクエストを許可するようにウェブサイトを設定する方法に関するMozilla の記事に従っています。IIS マネージャーを使用して、次の HTTP 応答ヘッダーを追加しました

Access-Control-Allow-Origin  : *
Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS

それにもかかわらず、ブラウザ (Firefox および Chrome) がカスタムヘッダー405 Method Not Allowedを使用してプリフライト リクエストを送信すると、エラーが発生し続けます。SecurityPrivateKeyID

リクエスト

OPTIONS /Service/Json/User.svc/ HTTP/1.1
Host: serviceprovider.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://client.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: securityprivatekeyid
Connection: keep-alive

応答

HTTP/1.1 405 Method Not Allowed
Allow: GET
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/8.0
access-control-allow-origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Origin, SecurityPrivateKeyID
Date: Sat, 23 Mar 2013 08:35:03 GMT

に直接アクセスすると、サービスは正常に動作しhttp://serviceprovider.com/Service/Json/User.svc/ます。

私が間違っていることについてのアイデアはありますか?

[私のマシンで client.com と serviceprovider.com を指すようにホスト ファイルを変更したことに注意してください]

[私の Web サービスは POST、PUT、および DELETE メソッドを使用できる必要があるため、JSONP を使用したソリューションは機能しません]

4

3 に答える 3

23

私の IIS 8 インスタンスは新規インストールです。Handler Mappings

IIS 構成のバックアップ

提案された変更のいずれかによって既存の Web サイトが破損した場合は、applicationhost.config ファイルのバックアップを作成することをお勧めします。

  1. 案内するC:\Windows\System32\inetsrv\config
  2. のコピーを作成applicationhost.config

未使用のハンドラーを削除する

出発点として、未使用のハンドラー マッピングをすべて削除して、問題の領域を減らしました。これを行うには、applicationhost.config直接変更するか、IIS マネージャーを使用します。

  1. IIS マネージャーを開く
  2. サーバー ノードまたは個々の Web サイト ノードで、ハンドラー マッピング機能を選択します。
  3. 不要なすべてのマッピングを手動で削除します。

私の Web サイトはサービスに大きく依存しており、静的ファイルと拡張子が.aspxとのファイルのみに依存しています。また、構成ファイル全体の.svcすべての参照を手動で削除しました。.NET 2.0

OPTIONS ハンドラを追加

これは修正のようです。

  1. IIS マネージャーを開く
  2. サーバー ノードまたは個々の Web サイト ノードで、ハンドラー マッピング機能を選択します。
  3. 左側の列で選択Add Module Mapping
  4. Add Module Mappingダイアログでは、次の値を使用します 。
    • Request path-*
    • Module-ProtocolSupportModule
    • Executable- [空白のまま]
    • Name- [あなたが望むものなら、なんでも]
  5. クリックRequest Restrictions
    • Mappingタブで、チェックを外しますInvoke handler only if request is mapped to
    • VerbsタブOPTIONSで が選択されていることを確認します
    • Accessタブで選択Script

結果のハンドラー構成は次のようになります

<handlers accessPolicy="Read, Script">
    <add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />
    <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
于 2013-03-24T13:26:49.267 に答える
1

私の場合:

  1. リクエストの「Access-Control-Allow-Headers」と「Access-Control-Allow-Methods」が、レスポンスのそれ以下であることを確認してください (「*」は使用しないでください)。

  2. <remove name="OPTIONSVerbHandler" />Web.config でこの行を削除します

于 2016-09-28T08:02:34.483 に答える