web-dev-qa-db-ja.com

ASP.Net MVCでAccess-Control-Allow-Originを設定する-最も簡単な方法

Jsonを返す簡単なactionmethodがあります。 ajax.example.comで実行されます。別のサイトsomeothersite.comからこれにアクセスする必要があります。

私はそれを呼び出そうとすると、私は期待されます...:

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

これを回避する2つの方法を知っています: JSONP と、ヘッダーを設定するために カスタムHttpHandler を作成します。

もっと簡単な方法はありませんか?

単純なアクションでは、許可された発信元のリストを定義することはできませんか、それとも全員を許可するだけですか?たぶんアクションフィルター?

最適なのは...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
196
Kjensen

プレーンASP.NET MVCコントローラーの場合

新しい属性を作成する

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

アクションにタグを付けます:

[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

ASP.NET Web APIの場合

using System;
using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

APIコントローラー全体にタグを付けます:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

または個々のAPI呼び出し:

[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

Internet Explorer <= v9の場合

IE <= 9はCORSをサポートしていません。これらのリクエストをプロキシ経由で自動的にルーティングするjavascriptを作成しました。すべて完全に透過的です(プロキシとスクリプトを含めるだけです)。

Nuget corsproxyを使用してダウンロードし、付属の指示に​​従います。

ブログ投稿 | ソースコード

363
jgauffin

IIS 7+を使用している場合、system.webServerセクションでこれを使用してweb.configファイルをフォルダーのルートに配置できます。

<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>
</httpProtocol>

参照: http://msdn.Microsoft.com/en-us/library/ms178685.aspx および: http://enable-cors.org/#how-iis7 =

115
LaundroMatt

リクエストがクッキーで渡されたときにブラウザが取得したコンテンツの提供をブラウザが拒否し(たとえば、xhrのwithCredentials=true)、サイトのAccess-Control-Allow-Origin*に設定されているという問題に遭遇しました。 (Chromeのエラーは、「資格情報フラグがtrueの場合、Access-Control-Allow-Originでワイルドカードを使用できません。」)

@jgauffinからの回答に基づいて、私はこれを作成しました。これは、基本的にその特定のブラウザーのセキュリティチェックを回避する方法であるため、注意が必要です。

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // We'd normally just use "*" for the allow-Origin header, 
        // but Chrome (and perhaps others) won't allow you to use authentication if
        // the header is set to "*".
        // TODO: Check elsewhere to see if the Origin is actually on the list of trusted domains.
        var ctx = filterContext.RequestContext.HttpContext;
        var Origin = ctx.Request.Headers["Origin"];
        var allowOrigin = !string.IsNullOrWhiteSpace(Origin) ? Origin : "*";
        ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
        ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
        ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        base.OnActionExecuting(filterContext);
    }
}
20
Ken Smith

これは本当に簡単です。web.configに追加するだけです

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="http://localhost" />
      <add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" />
      <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
      <add name="Access-Control-Max-Age" value="1000" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Originでは、Webサーバーにアクセスできるすべてのドメインを配置し、ヘッダーには、任意のajax httpリクエストで使用可能なすべてのヘッダーを配置し、メソッドには、サーバーで許可するすべてのメソッドを配置します

よろしく:)

14
Zvonimir Tokic

WebAPI 2には、次を使用してインストールできるCORSのパッケージがあります:Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic

これがインストールされたら、コードに従ってこれに従ってください: http://www.asp.net/web-api/overview/security/enabling-cross-Origin-requests-in-web-api

8
Tarun

OPTIONS動詞も問題を引き起こすことがあります

単純:web.configを次のように更新します

<system.webServer>
    <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

そして、httpGetとhttpOptionsでwebservice/controllerヘッダーを更新します

// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {
8
Bishoy Hanna

APIを使用している場合、この行をメソッドに追加します。

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
3
Gopichandar

このチュートリアル は非常に便利です。簡単に要約するには:

  1. Nugetで利用可能なCORSパッケージを使用します:Install-Package Microsoft.AspNet.WebApi.Cors

  2. WebApiConfig.csファイルで、config.EnableCors()Register()メソッドに追加します。

  3. Corsを処理するために必要なコントローラーに属性を追加します。

[EnableCors(origins: "<Origin address in here>", headers: "*", methods: "*")]

3
    public ActionResult ActionName(string ReqParam1, string ReqParam2, string ReqParam3, string ReqParam4)
    {
        this.ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*");
         /*
                --Your code goes here --
         */
        return Json(new { ReturnData= "Data to be returned", Success=true }, JsonRequestBehavior.AllowGet);
    }
2
Pranav Labhe

Access-Control-Expose-Headersを渡す方法はいくつかあります。

  • Jgauffinが説明したように、新しい属性を作成できます。
  • LaundroMattが説明したように、web.configファイルに追加できます。
  • 別の方法は、webApiconfig.csファイルに以下のコードを追加することです。

    config.EnableCors(new EnableCorsAttribute( ""、headers: ""、methods: "*"、exposedHeaders: "TestHeaderToExpose"){SupportsCredentials = true});

または、Global.Asaxファイルに以下のコードを追加できます。

protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

私はオプションのためにそれを書きました。必要に応じて変更してください。

ハッピーコーディング!!

1
Trilok Pathak

Web.configで次を入力します

<system.webServer>
<httpProtocol>
  <customHeaders>
    <clear />     
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Origin" value="http://localhost:123456(etc)" />
  </customHeaders>
</httpProtocol>
0
Elvis

IISを使用する場合は、 IIS CORSモジュール を試すことをお勧めします。
設定が簡単で、すべてのタイプのコントローラーで機能します。

設定の例を次に示します。

    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add Origin="*" />
            <add Origin="https://*.Microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add Origin="http://*" allowed="false" />
        </cors>
    </system.webServer>
0
olsh