web-dev-qa-db-ja.com

CORS POSTリクエストが機能しない-オプション(不正なリクエスト)-オリジンは許可されません

最新のベータ2リリースでは、クロスドメインPOST Apiコントローラーをヒットするリクエストを取得するのに多くの問題があります。

Chrome(および他のブラウザー)が吐き出します:

OPTIONS http://api.hybridwebapp.com/api/values 400 (Bad Request)
POST http://api.hybridwebapp.com/api/values 404 (Not Found) 

この問題 に関連している可能性がありますが、その回避策とweb.configなどの他の修正を適用しました additions here

私はしばらくの間これで頭を叩いてきたので、問題を正確に再現するソリューションを作成しました。

Webアプリを読み込むと、POSTのGETボタンが1つあり、ボタンの横に応答が表示されます。GETは機能します。POST正常に戻ります。

enter image description here

私はFiddlerから原因のヒントを得ることができますが、応答を見るとAccess-Controll-Allow-Originヘッダーにドメインが含まれているため、意味がありません:

enter image description here

ソリューションには、「ConfigurationScreenshots」と呼ばれるフォルダーがあり、IIS構成(Webサイトバインディング)およびプロジェクトプロパティの構成のスクリーンショットがいくつかあります。

編集:ホストファイル(%SystemRoot%\ system32\drivers\etc)にこのエントリを追加することを忘れないでください:

 127.0.0.1     hybridwebapp.com  api.hybridwebapp.com

**ステータス:** Chromeなどの一部のブラウザでは、OPTIONS応答のエラーメッセージに関係なく、POST Firefoxのようなことはありません)。しかし、私はそれが解決したとは思わない。

所有しているOPTIONSリクエストのFidlerスクリーンショットをご覧ください

Access-Control-Allow-Origin: http://hybridwebapp.com

そしてまだエラー:

Origin http://hybridwebapp.com は許可されていません

それは完全に矛盾しています。まるでヘッダーを無視しているようです。

27
parliament

OKこれは私が今まで遭遇した中で最も奇妙な問題にならなければなりません。これを「解決」する方法は次のとおりです。

  1. 突然、どこからでもないこのドメインへのOPTIONSリクエストが200 OKを返し始め(400の悪いリクエストの代わりに)、POST決して起こらない(または少なくとも、ブラウザがそれを飲み込むからではないようです)
  2. FiddlerのOPTIONS応答に「Access-Control-Allow-XXX」の重複が不思議なことに含まれていることを認識してください。
  3. 前の問題を修正しようとして、それが機能しないことをはっきりと覚えていても、web.configから次のステートメントを削除してみてください。

これを削除します:

    <httpProtocol>
       <customHeaders>
         <remove name="X-Powered-By" />
         <add name="Access-Control-Allow-Origin" value="http://mydomain.com" />
         <add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
         <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
       </customHeaders>
    </httpProtocol>

あなたはすでにこれを持っているから:

 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);

道徳:あなただけが必要です。

23
parliament

OAuth Authorization。requestをWeb APIに直接送信しない場合。そのエンドポイントに対してOWIN CORSサポートを有効にする必要があります。

自分のサイトでの操作:owin corsをインストールします

Install-Package Microsoft.Owin.Cors

注:使用しないでくださいInstall-Package Microsoft.AspNet.WebApi.Cors

ファイルStartup.Auth.cs内

 //add this line
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            // Enable the application to use bearer tokens to authenticate users
            app.UseOAuthBearerTokens(OAuthOptions);
12
Grey Wolf

私はMVCコントローラー(ApiControllerではない)を持っていますが、私が思いついた解決策は他の人を助けるかもしれません。 POSTアクション(/data/xlsx)コントローラーに2つのアクションを実装しました。

  1. 飛行前チェック用
  2. 投稿用

HttpOptionsアクションがない場合、プリフライトチェックで404を取得します。

コード:

[HttpOptions]
public ActionResult Xlsx()
{
    // Catches and authorises pre-flight requests for /data/xlsx from remote domains
    Response.AddHeader("Access-Control-Allow-Origin", "*");
    Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
    return null;
}

[HttpPost]
public ActionResult Xlsx(string data, string name)
{
    Xlsx(); // Add CORS headers

    /* ... implementation here ... */
}

IE 11、Chrome、FireFox。

2
Ilan

ConfigureOAuth内のstartup.csファイルにこれを追加

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

2
Mohsin Muzawar

Responseヘッダーに以下のコードを追加してください。

Response.AddHeader("Access-Control-Allow-Origin", "*");
0
Wilson Wu