ASP.NET Web API 2 ' de çapraz kaynak isteklerini etkinleştirme

, Mike te son

Bu içerik önceki bir .NET sürümü içindir. Yeni geliştirme ASP.NET Corekullanmalıdır. ASP.NET Core ' de Web API 'SI ve çıkış noktaları arası Istekleri (CORS) kullanma hakkında daha fazla bilgi için bkz.:

Tarayıcı güvenliği, bir web sitesinin başka bir etki alanına AJAX istekleri göndermesini engeller. Bu kısıtlamaya aynı-Origin ilkesi adı verilir ve kötü amaçlı bir sitenin başka bir siteden hassas verileri okumasını önler. Ancak, bazen diğer sitelerin Web API 'nizi çağırmasını sağlamak isteyebilirsiniz.

Çapraz kaynak kaynak paylaşımı (CORS), bir sunucunun aynı kaynak ilkeyi rahat bir şekilde sağlamasına olanak tanıyan bir W3C standardıdır. CORS kullanarak, bir sunucu bazı çapraz kaynak isteklerine, diğerlerini reddetirken açık bir şekilde izin verebilir. CORS, JSONPgibi önceki tekniklerin daha güvenli ve daha esnektir. Bu öğreticide, Web API uygulamanızda CORS 'nin nasıl etkinleştirileceği gösterilmektedir.

Öğreticide kullanılan yazılım

Giriş

Bu öğreticide, ASP.NET Web API 'sinde CORS desteği gösterilmektedir. Bir Web API denetleyicisi barındıran "WebService" adlı, diğeri de WebService 'yi çağıran "WebClient" adlı iki ASP.NET projesi oluşturarak başlayacağız. İki uygulama farklı etki alanlarında barındırıldığından, WebClient 'dan WebService 'a yönelik bir AJAX isteği bir çapraz kaynak isteği olur.

Web hizmetini ve Web istemcisini gösterir

"Aynı kaynak" nedir?

Aynı şemalara, konaklara ve bağlantı noktalarına sahip olmaları durumunda iki URL aynı kaynağa sahiptir. (RFC 6454)

Bu iki URL aynı kaynağa sahiptir:

  • http://example.com/foo.html
  • http://example.com/bar.html

Bu URL 'Ler, önceki iki değerden farklı kaynaklardan farklıdır:

  • http://example.net -Farklı etki alanı
  • http://example.com:9000/foo.html -Farklı bağlantı noktası
  • https://example.com/foo.html -Farklı düzen
  • http://www.example.com/foo.html -Farklı alt etki alanı

Note

Internet Explorer, kaynakları karşılaştırırken bağlantı noktasını dikkate almaz.

WebService projesi oluşturma

Note

Bu bölümde, Web API projeleri oluşturmayı bildiğiniz varsayılmaktadır. Aksi takdirde, bkz. ASP.NET Web API 'si Ile çalışmayabaşlama.

  1. Visual Studio 'Yu başlatın ve yeni bir ASP.NET Web uygulaması (.NET Framework) projesi oluşturun.

  2. Yeni ASP.NET Web uygulaması Iletişim kutusunda boş proje şablonunu seçin. Klasör ve temel başvuru Ekle' nin altında Web API onay kutusunu seçin.

    Visual Studio 'da yeni ASP.NET Project iletişim kutusu

  3. Aşağıdaki kodla adlı bir Web API denetleyicisi ekleyin TestController :

    using System.Net.Http;
    using System.Web.Http;
    
    namespace WebService.Controllers
    {
        public class TestController : ApiController
        {
            public HttpResponseMessage Get()
            {
                return new HttpResponseMessage()
                {
                    Content = new StringContent("GET: Test message")
                };
            }
    
            public HttpResponseMessage Post()
            {
                return new HttpResponseMessage()
                {
                    Content = new StringContent("POST: Test message")
                };
            }
    
            public HttpResponseMessage Put()
            {
                return new HttpResponseMessage()
                {
                    Content = new StringContent("PUT: Test message")
                };
            }
        }
    }
    
  4. Uygulamayı yerel olarak çalıştırabilir veya Azure 'a dağıtabilirsiniz. (Bu öğreticideki ekran görüntüleri için, uygulama Azure App Service Web Apps dağıtılır.) Web API 'sinin çalıştığını doğrulamak için adresine gidin http://hostname/api/test/ . burada, ana bilgisayar adı uygulamayı dağıttığınız etki alanıdır. Yanıt metnini, " get: test iletisini görmeniz gerekir " .

    Sınama iletisini gösteren Web tarayıcısı

WebClient projesi oluşturma

  1. Başka bir ASP.NET Web uygulaması (.NET Framework) projesi oluşturun ve MVC proje şablonunu seçin. İsteğe bağlı olarak kimlik doğrulaması yok kimlik doğrulama ' yı seçin > . Bu öğretici için kimlik doğrulamaya gerek yoktur.

    Visual Studio 'da yeni ASP.NET proje iletişim kutusunda MVC şablonu

  2. Çözüm Gezgini' de, Görünümler/Home/Index. cshtml dosyasını açın. Bu dosyadaki kodu aşağıdaki kodla değiştirin:

    <div>
        <select id="method">
            <option value="get">GET</option>
            <option value="post">POST</option>
            <option value="put">PUT</option>
        </select>
        <input type="button" value="Try it" onclick="sendRequest()" />
        <span id='value1'>(Result)</span>
    </div>
    
    @section scripts {
    <script>
        // TODO: Replace with the URL of your WebService app
        var serviceUrl = 'http://mywebservice/api/test'; 
    
        function sendRequest() {
            var method = $('#method').val();
    
            $.ajax({
                type: method,
                url: serviceUrl
            }).done(function (data) {
                $('#value1').text(data);
            }).fail(function (jqXHR, textStatus, errorThrown) {
                $('#value1').text(jqXHR.responseText || textStatus);
            });
        }
    </script>
    }
    

    ServiceUrl değişkeni için WEBSERVICE uygulamasının URI 'sini kullanın.

  3. WebClient uygulamasını yerel olarak çalıştırın veya başka bir Web sitesinde yayımlayın.

"Dene" düğmesine tıkladığınızda, Web hizmeti uygulamasına açılan kutuda listelenen HTTP yöntemi kullanılarak bir AJAX isteği gönderilir (GET, POST veya PUT). Bu, farklı çapraz kaynak isteklerini incelemenizi sağlar. Şu anda, Web hizmeti uygulaması CORS 'yi desteklemez, bu nedenle düğmeye tıkladığınızda bir hata alırsınız.

Tarayıcıda ' deneyin ' hatası

Note

HTTP trafiğini Fiddlergibi bir araçta izleyebilirsiniz, tarayıcının get isteğini göndereceğini ve isteğin başarılı olduğunu, ancak Ajax çağrısının bir hata döndürdüğünü görürsünüz. Aynı kaynak ilkenin tarayıcının isteği göndermesini önleyemediğinden emin olmak önemlidir. Bunun yerine, uygulamanın yanıtı görmesini önler.

Web isteklerini gösteren Fiddler Web hata ayıklayıcısı

CORS'yi etkinleştirme

Şimdi WebService uygulamasında CORS 'yi etkinleştirelim. İlk olarak CORS NuGet paketini ekleyin. Visual Studio 'da, Araçlar menüsünden NuGet Paket Yöneticisi' ni ve ardından Paket Yöneticisi konsolu' nu seçin. Paket Yöneticisi konsolu penceresinde aşağıdaki komutu yazın:

Install-Package Microsoft.AspNet.WebApi.Cors

Bu komut, en son paketi yüklenir ve çekirdek Web API kitaplıkları da dahil olmak üzere tüm bağımlılıkları günceller. -VersionBelirli bir sürümü hedeflemek için bayrağını kullanın. CORS paketi için Web API 2,0 veya üzeri gerekir.

App _ Start/WebApiConfig. cs dosyasını açın. WebApiConfig. Register yöntemine aşağıdaki kodu ekleyin:

using System.Web.Http;
namespace WebService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // New code
            config.EnableCors();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

Sonra, [Enablecors] özniteliğini TestController sınıfına ekleyin:

using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;

namespace WebService.Controllers
{
    [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
    public class TestController : ApiController
    {
        // Controller methods not shown...
    }
}

Kaynakları parametresi Için, WebClient UYGULAMASıNı dağıttığınız URI 'yi kullanın. Bu, aynı zamanda diğer tüm etki alanları arası isteklere izin verdiğinden WebClient kaynaklı çapraz kaynak isteklerine izin verir. Daha sonra, [Enablecors] parametrelerini daha ayrıntılı olarak açıklayacağım.

Çıkış URL 'sinin sonuna eğik çizgi eklemeyin.

Güncelleştirilmiş Web hizmeti uygulamasını yeniden dağıtın. WebClient 'ı güncelleştirmeniz gerekmez. Şimdi WebClient 'daki AJAX isteği başarılı olmalıdır. GET, PUT ve POST yöntemlerine izin verilir.

Başarılı sınama iletisini gösteren Web tarayıcısı

CORS nasıl kullanılır?

Bu bölümde, HTTP iletileri düzeyinde bir CORS isteğinde ne olacağı açıklanmaktadır. CORS 'nin nasıl çalıştığını anlamak önemlidir. böylece, [Enablecors] özniteliğini doğru şekilde yapılandırabilir ve her şeyin beklendiği gibi çalışmadığına sorun giderebilirsiniz.

CORS belirtimi, çıkış noktaları arası istekleri etkinleştiren birkaç yeni HTTP üst bilgisi sunar. Bir tarayıcı CORS 'yi destekliyorsa, bu üst bilgileri, çıkış noktaları arası istekler için otomatik olarak ayarlar; JavaScript kodunuzda özel bir şey yapmanız gerekmez.

Bir çapraz kaynak isteğine bir örnek aşağıda verilmiştir. "Origin" üstbilgisi, isteği yapan sitenin etki alanını verir.

GET http://myservice.azurewebsites.net/api/test HTTP/1.1
Referer: http://myclient.azurewebsites.net/
Accept: */*
Accept-Language: en-US
Origin: http://myclient.azurewebsites.net
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net

Sunucu isteğe izin veriyorsa, erişim-denetim-Izin-kaynak üst bilgisini ayarlar. Bu üstbilginin değeri, kaynak üstbilgisiyle eşleşir veya "" joker değeridir * , yani herhangi bir kaynağa izin verilir.

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/plain; charset=utf-8
Access-Control-Allow-Origin: http://myclient.azurewebsites.net
Date: Wed, 05 Jun 2013 06:27:30 GMT
Content-Length: 17

GET: Test message

Yanıt, erişim-denetim-Izin verme-kaynak üst bilgisini içermiyorsa, AJAX isteği başarısız olur. Özellikle, tarayıcı isteğe izin vermez. Sunucu başarılı bir yanıt döndürse bile tarayıcı, yanıtı istemci uygulaması için kullanılabilir hale getirmez.

Ön kontrol Istekleri

Bazı CORS istekleri için, tarayıcı kaynağın gerçek isteğini göndermeden önce "ön kontrol isteği" olarak adlandırılan ek bir istek gönderir.

Aşağıdaki koşullar doğruysa tarayıcı, ön kontrol isteğini atlayabilir:

  • İstek yöntemi al, HEAD veya POST, ve

  • Uygulama, kabul etme, kabul etme dili, Içerik-dil, Içerik türü veya son olay KIMLIĞI dışında bir istek üst bilgisi ayarlanmamış ve

  • Content-Type üst bilgisi (ayarlandıysa) aşağıdakilerden biridir:

    • Application/x-www-form-urlencoded
    • multipart/form-Data
    • metin/düz

İstek üstbilgileri hakkındaki kural, uygulamanın setRequestHeader XMLHttpRequest nesnesine çağırarak ayarladığı üst bilgiler için geçerlidir. (CORS belirtimi bu "yazar istek üstbilgilerini" çağırır.) Kural, tarayıcı tarafından ayarlanan Kullanıcı Aracısı, ana bilgisayar veya içerik uzunluğu gibi üstbilgilere uygulanmaz.

Bir ön kontrol isteğine bir örnek aşağıda verilmiştir:

OPTIONS http://myservice.azurewebsites.net/api/test HTTP/1.1
Accept: */*
Origin: http://myclient.azurewebsites.net
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: accept, x-my-custom-header
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net
Content-Length: 0

Uçuş öncesi isteği HTTP SEÇENEKLERI yöntemini kullanır. İki özel üst bilgi içerir:

  • Access-Control-Request-Method: gerçek istek için kullanılacak HTTP yöntemi.
  • Erişim-denetim-Istek-üstbilgiler: uygulamanın gerçek istekte ayarlandığı istek üst bilgilerinin bir listesi. (Yine, bu, tarayıcının ayarladığı üst bilgileri içermez.)

Sunucunun isteğe izin verdiğini kabul eden örnek bir yanıt aşağıda verilmiştir:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Access-Control-Allow-Origin: http://myclient.azurewebsites.net
Access-Control-Allow-Headers: x-my-custom-header
Access-Control-Allow-Methods: PUT
Date: Wed, 05 Jun 2013 06:33:22 GMT

Yanıt, izin verilen yöntemleri ve isteğe bağlı olarak izin verilen üst bilgileri listeleyen bir erişim-denetimi-Izin-üstbilgiler başlığını listeleyen bir Access-Control-Allow-Methods üst bilgisi içerir. Ön kontrol isteği başarılı olursa, tarayıcı, daha önce açıklandığı gibi gerçek isteği gönderir.

Sık kullanılan araçlar, ön uç noktalarını (örneğin, Fiddler ve Postman), varsayılan olarak gerekli seçenek üstbilgilerini göndermez. Access-Control-Request-MethodVe Access-Control-Request-Headers üst bilgilerinin istekle birlikte GÖNDERILDIĞINI ve seçenekler başlıklarının IIS aracılığıyla uygulamaya ulaşmasını onaylayın.

IIS 'yi bir ASP.NET uygulamasının seçenek isteklerini almasını ve işlemesini sağlayacak şekilde yapılandırmak için, aşağıdaki yapılandırmayı bölümünde uygulamanın web.config dosyasına ekleyin <system.webServer><handlers> :

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

' Nin kaldırılması, OPTIONSVerbHandler IIS 'nın seçenek isteklerini işlemesini engeller. ExtensionlessUrlHandler-Integrated-4.0Varsayılan modül kaydı yalnızca uzantısız URL 'ler Ile alma, baş, post ve hata ayıklama isteklerine izin verdiğinden, ' nin yerini değiştirme, seçeneklere ulaşmak için izin verir.

[EnableCors] için kapsam kuralları

Uygulamanızdaki tüm Web API denetleyicileri için işlem başına CORS 'yi, denetleyici başına veya genel olarak etkinleştirebilirsiniz.

Eylem başına

CORS 'yi tek bir eylem için etkinleştirmek üzere, eylem yönteminde [Enablecors] özniteliğini ayarlayın. Aşağıdaki örnek yalnızca yöntemi için CORS 'yi etkinleştirmesine izin vermez GetItem .

public class ItemsController : ApiController
{
    public HttpResponseMessage GetAll() { ... }

    [EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
    public HttpResponseMessage GetItem(int id) { ... }

    public HttpResponseMessage Post() { ... }
    public HttpResponseMessage PutItem(int id) { ... }
}

Denetleyici başına

Denetleyici sınıfında [Enablecors] ayarlarsanız, denetleyici üzerindeki tüm eylemler için geçerli olur. Bir eylemde CORS 'yi devre dışı bırakmak için, eyleme [Disablecors] özniteliğini ekleyin. Aşağıdaki örnek, hariç her yöntem için CORS 'yi etkinleştirmesine izin vermez PutItem .

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
public class ItemsController : ApiController
{
    public HttpResponseMessage GetAll() { ... }
    public HttpResponseMessage GetItem(int id) { ... }
    public HttpResponseMessage Post() { ... }

    [DisableCors]
    public HttpResponseMessage PutItem(int id) { ... }
}

Görünüm

Uygulamanızdaki tüm Web API denetleyicileri için CORS 'yi etkinleştirmek üzere Enablecorsattribute örneğini enablecors yöntemine geçirin:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("www.example.com", "*", "*");
        config.EnableCors(cors);
        // ...
    }
}

Özniteliği birden fazla kapsamda ayarlarsanız, öncelik sırası şu şekilde olur:

  1. Eylem
  2. Denetleyici
  3. Genel

İzin verilen kaynakları ayarla

[Enablecors] özniteliğinin kaynaklar parametresi, kaynağa hangi kaynakların erişmelerine izin verildiğini belirtir. Değer, izin verilen çıkış noktaları için virgülle ayrılmış bir listesidir.

[EnableCors(origins: "http://www.contoso.com,http://www.example.com", 
    headers: "*", methods: "*")]

*Tüm kaynaklardan gelen isteklere izin vermek için "" joker değerini de kullanabilirsiniz.

Herhangi bir kaynaktan isteklere izin vermeden önce dikkatlice düşünün. Bu, tam olarak herhangi bir Web sitesinin Web API 'niz için AJAX çağrıları yapabileceği anlamına gelir.

// Allow CORS for all origins. (Caution!)
[EnableCors(origins: "*", headers: "*", methods: "*")]

İzin verilen HTTP yöntemlerini ayarlama

[Enablecors] özniteliğinin Methods parametresi, hangi http yöntemlerinin kaynağa erişmelerine izin verileceğini belirtir. Tüm yöntemlere izin vermek için "" joker değerini kullanın * . Aşağıdaki örnek yalnızca GET ve POST isteklerine izin verir.

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "get,post")]
public class TestController : ApiController
{
    public HttpResponseMessage Get() { ... }
    public HttpResponseMessage Post() { ... }
    public HttpResponseMessage Put() { ... }    
}

İzin verilen istek üst bilgilerini ayarlama

Bu makalede, bir ön kontrol isteğinin, uygulama tarafından ayarlanan HTTP üstbilgilerini (yani, "yazar istek üstbilgileri") listeleyerek bir erişim denetimi-Istek-üstbilgiler üst bilgisi nasıl dahil olabileceği açıklanmaktadır. [Enablecors] özniteliğinin Headers parametresi hangi yazar istek üst bilgilerine izin verileceğini belirtir. Tüm üstbilgilere izin vermek için üst bilgileri "" olarak ayarlayın * . Belirli üstbilgilere izin vermek için, üst bilgileri izin verilen üst bilgilerin virgülle ayrılmış listesine ayarlayın:

[EnableCors(origins: "http://example.com", 
    headers: "accept,content-type,origin,x-my-header", methods: "*")]

Ancak, tarayıcılar erişim-denetim-Istek üst bilgilerini ayarlama konusunda tamamen tutarlı değildir. Örneğin, Chrome şu anda "Origin" i içerir. FireFox, uygulama bunları betikte ayarlarsa bile, "kabul et" gibi standart üstbilgileri içermez.

Üst bilgileri "" dışında bir şeye ayarlarsanız * , en az "kabul", "içerik türü" ve "kaynak" ve ayrıca desteklemek istediğiniz tüm özel üstbilgileri dahil etmelisiniz.

İzin verilen yanıt üst bilgilerini ayarlama

Varsayılan olarak tarayıcı, tüm yanıt üst bilgilerini uygulamaya sunmaz. Varsayılan olarak kullanılabilen yanıt üstbilgileri şunlardır:

  • Cache-Control
  • İçerik-dil
  • İçerik Türü
  • Süre Sonu
  • Last-Modified
  • Prag

CORS belirtimi bu basit yanıt üstbilgileriniçağırır. Diğer üst bilgileri uygulama için kullanılabilir hale getirmek için, [Enablecors] exposedHeaders parametresini ayarlayın.

Aşağıdaki örnekte, denetleyicinin Get yöntemi ' X-Custom-Header ' adlı bir özel üst bilgi ayarlıyor. Varsayılan olarak tarayıcı, bu üst bilgiyi bir çapraz kaynak isteğinde kullanıma sunmaz. Üstbilgiyi kullanılabilir hale getirmek için, exposedHeaders Içine ' X-Custom-Header ' ekleyin.

[EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")]
public class TestController : ApiController
{
    public HttpResponseMessage Get()
    {
        var resp = new HttpResponseMessage()
        {
            Content = new StringContent("GET: Test message")
        };
        resp.Headers.Add("X-Custom-Header", "hello");
        return resp;
    }
}

Kimlik bilgilerini, çıkış noktaları arası isteklere geçirme

Kimlik bilgileri CORS isteğinde özel işleme gerektirir. Varsayılan olarak tarayıcı, bir çapraz kaynak isteğiyle kimlik bilgileri göndermez. Kimlik bilgileri, HTTP kimlik doğrulama düzenlerini de içerir. Bir çapraz kaynak isteğiyle kimlik bilgilerini göndermek için, istemcinin XMLHttpRequest. withcredentials öğesini true olarak ayarlaması gerekir.

Doğrudan XMLHttpRequest kullanma:

var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/test');
xhr.withCredentials = true;

JQuery içinde:

$.ajax({
    type: 'get',
    url: 'http://www.example.com/api/test',
    xhrFields: {
        withCredentials: true
    }

Ayrıca, sunucu kimlik bilgilerine izin vermelidir. Web API 'sinde, çıkış noktaları arası kimlik bilgilerine izin vermek için, [Enablecors] özniteliğinde SupportsCredentials özelliğini true olarak ayarlayın:

[EnableCors(origins: "http://myclient.azurewebsites.net", headers: "*", 
    methods: "*", SupportsCredentials = true)]

Bu özellik true ise, HTTP yanıtı bir erişim-denetim-Izin-kimlik bilgileri üst bilgisi içerecektir. Bu üst bilgi, tarayıcıya sunucunun bir çapraz kaynak isteği için kimlik bilgilerini verdiğini söyler.

Tarayıcı kimlik bilgilerini gönderirse, ancak yanıt geçerli bir erişim-denetim-Izin-kimlik bilgileri üst bilgisi içermiyorsa, tarayıcı uygulamaya yanıtı kullanıma sunmaz ve AJAX isteği başarısız olur.

SupportsCredentials değeri true olarak ayarlanırken, başka bir etki alanındaki bir Web sitesinin kullanıcı adına Kullanıcı adına, oturum açmış bir kullanıcının kimlik bilgilerini, Kullanıcı tarafından farkında olmadan BIR Web API 'nize gönderebildiğinden emin olun. CORS belirtimi Ayrıca " * " SupportsCredentials true ise, çıkış ayarının geçersiz olduğunu belirtir.

Özel CORS ilke sağlayıcıları

[Enablecors] özniteliği ıcorspolicyprovider arabirimini uygular. Özniteliğinden türetilen ve ıcorspolicyprovider uygulayan bir sınıf oluşturarak kendi uygulamanızı sağlayabilirsiniz.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MyCorsPolicyAttribute : Attribute, ICorsPolicyProvider 
{
    private CorsPolicy _policy;

    public MyCorsPolicyAttribute()
    {
        // Create a CORS policy.
        _policy = new CorsPolicy
        {
            AllowAnyMethod = true,
            AllowAnyHeader = true
        };

        // Add allowed origins.
        _policy.Origins.Add("http://myclient.azurewebsites.net");
        _policy.Origins.Add("http://www.contoso.com");
    }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request)
    {
        return Task.FromResult(_policy);
    }
}

Artık özniteliği, [Enablecors] yerine koyabileceğiniz herhangi bir yerde uygulayabilirsiniz.

[MyCorsPolicy]
public class TestController : ApiController
{
    .. //

Örneğin, özel bir CORS ilke sağlayıcısı yapılandırma dosyasından ayarları okuyabilir.

Öznitelikleri kullanmanın bir alternatifi olarak ıcorspolicyprovider nesneleri oluşturan bir ıcorspolicyproviderfactory nesnesini kaydedebilirsiniz.

public class CorsPolicyFactory : ICorsPolicyProviderFactory
{
    ICorsPolicyProvider _provider = new MyCorsPolicyProvider();

    public ICorsPolicyProvider GetCorsPolicyProvider(HttpRequestMessage request)
    {
        return _provider;
    }
}

Icorspolicyproviderfactory ayarlamak için, başlangıç sırasında setcorspolicyproviderfactory genişletme yöntemini aşağıdaki gibi çağırın:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SetCorsPolicyProviderFactory(new CorsPolicyFactory());
        config.EnableCors();

        // ...
    }
}

Tarayıcı desteği

Web API CORS paketi, sunucu tarafı teknolojisidir. Kullanıcının tarayıcısının de CORS 'yi desteklemesi gerekir. Neyse ki, tüm büyük tarayıcıların geçerli sürümleri cors desteğiiçerir.