Tiêu đề 'Access-Control-Allow-Origin' chứa nhiều giá trị


104

Tôi đang sử dụng AngularJS $ http ở phía máy khách để truy cập điểm cuối của ứng dụng ASP.NET Web API ở phía máy chủ. Vì máy khách được lưu trữ trên một miền khác làm máy chủ, tôi cần CORS. Nó hoạt động cho $ http.post (url, dữ liệu). Nhưng ngay sau khi tôi xác thực người dùng và đưa ra yêu cầu qua $ http.get (url), tôi nhận được thông báo

Tiêu đề 'Access-Control-Allow-Origin' chứa nhiều giá trị 'http://127.0.0.1:9000, http://127.0.0.1:9000', nhưng chỉ một giá trị được phép. Nguồn gốc 'http://127.0.0.1:9000' do đó không được phép truy cập.

Fiddler cho tôi thấy rằng thực sự có hai mục tiêu đề trong yêu cầu nhận sau khi yêu cầu tùy chọn thành công. Tôi đang làm sai điều gì và ở đâu?

Cập nhật

Khi tôi sử dụng jQuery $ .get thay vì $ http.get, thông báo lỗi tương tự sẽ xuất hiện. Vì vậy, điều này dường như không có vấn đề với AngularJS. Nhưng nó sai ở đâu?


Chà, tiêu đề chứa những gì?
eckes

Câu trả lời:


53

Tôi đã thêm

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

cũng như

app.UseCors(CorsOptions.AllowAll);

trên máy chủ. Điều này dẫn đến hai mục tiêu đề. Chỉ cần sử dụng cái sau và nó hoạt động.


4
Có vẻ như bạn đang đọc Properties.Settings.Default.Cors từ một tệp cài đặt. Bạn có thể đăng một ví dụ? Và UseCors ở lớp nào?
Hoppe

"Uncaught ReferenceError: EnableCorsAttribute không được xác định" ??
mạch

@Hoppe, vui lòng xem tại msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx . Nó giải thích rằng tham số đầu tiên của EnableCorsAttribute là nguồn gốc được phép. Ví dụ "*" để cho phép tất cả.
Papa Mufflon

1
@Hoppe, UseCors là một phương thức mở rộng được định nghĩa trong gói NuGet Microsoft.Owin.Cors. Sf katanaproject.codeplex.com/SourceControl/latest#src/… .
Papa Mufflon

7
config.EnableCors (enableCorsAttribute) thường được gọi trong WebApiConfig.cs - nó là một phần của gói Microsoft.AspNet.WebApi.Cors Nuget, việc sử dụng được mô tả ở đây: asp.net/web-api/overview/security/… app .UseCors (CorsOptions.AllowAll) thường được gọi trong Startup.Auth.cs như một phần của việc định cấu hình nhà cung cấp danh tính của bạn (ví dụ OAuth) và là một phần của gói Microsoft.Owin.Cors Nuget.
Henry C

51

Chúng tôi gặp sự cố này vì chúng tôi đã thiết lập CORS theo phương pháp hay nhất (ví dụ: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) VÀ CŨNG có một tiêu đề tùy chỉnh <add name="Access-Control-Allow-Origin" value="*"/>trong web.config.

Xóa mục nhập web.config và tất cả đều ổn.

Trái ngược với câu trả lời của @ mww, chúng tôi vẫn có EnableCors()trong WebApiConfig.cs VÀ một EnableCorsAttributetrên bộ điều khiển. Khi chúng tôi loại bỏ cái này hay cái kia, chúng tôi lại gặp phải những vấn đề khác.


11
Tôi đã xóa dòng này <add name = "Access-Control-Allow-Origin" value = "*" /> và tôi có hai mục nhập khác sau đây trong tệp web.config mà tôi chưa xóa: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Access-Control-Allow-Method "value =" GET, POST, PUT, DELETE, OPTIONS "/>
Siva Karthikeyan

2
Đây là chìa khóa, bạn chỉ được bật CORS một lần, vấn đề của tôi là tôi cũng đã bật nó trong web.config của mình cũng như app.UseCors () ... Tôi đã xóa mục nhập web.config và chỉ sử dụng ứng dụng.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); thay vào đó.
Mohammad Sepahvand

1
Dòng trên đã cứu mạng tôi! Đảm bảo rằng bạn không kích hoạt CORS nhiều lần, nếu không điều này sẽ xảy ra và bạn sẽ rất thất vọng.
TGarrett

loại bỏ các <add name = giá trị "Access-Control-Allow-Headers" = "Content-Type" /> từ web.config và cố định đối với tôi
jbooker

1
"Đây là chìa khóa, bạn chỉ được kích hoạt CORS một lần" <- ĐÂY LÀ ĐÂY @MohammadSepahvand CẢM ƠN. Quay lại .NET và đã ngạc nhiên: D.
Tuấn Jinn

42

Tôi đang sử dụng Cors 5.1.0.0, sau nhiều lần đau đầu, tôi phát hiện ra vấn đề là trùng lặp các tiêu đề Access-Control-Allow-Origin & Access-Control-Allow-Header từ máy chủ

Đã xóa config.EnableCors()khỏi tệp WebApiConfig.cs và chỉ đặt [EnableCors("*","*","*")]thuộc tính trên lớp Bộ điều khiển

Kiểm tra bài viết này để biết thêm chi tiết.


cái này phù hợp với tôi, chỉ cần đảm bảo rằng bạn không đặt cái khác như thế này <add name = "Access-Control-Allow-Origin" value = "*" /> trong web.config
Crismogram

12

Thêm vào Đăng ký WebApiConfig

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Hoặc web.config

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>  
</httpProtocol>

NHƯNG KHÔNG CẢ


2
Đây là giải pháp quan trọng đối với tôi, đừng làm cả hai.
robnick

8

Trên thực tế, bạn không thể đặt nhiều tiêu đề Access-Control-Allow-Origin(hoặc ít nhất nó sẽ không hoạt động trong tất cả các trình duyệt). Thay vào đó, bạn có thể đặt một biến môi trường có điều kiện và sau đó sử dụng nó trong Headerchỉ thị:

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN

Vì vậy, trong ví dụ này, tiêu đề phản hồi sẽ chỉ được thêm vào nếu tiêu đề yêu cầu Originkhớp với RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(về cơ bản nó có nghĩa là localhost qua HTTP hoặc HTTPS và * .my.base.domain qua HTTPS).

Hãy nhớ kích hoạt setenvifmô-đun.

Tài liệu:

BTW. Các }etrong %{ORIGIN_SUB_DOMAIN}ekhông phải là một lỗi đánh máy. Đó là cách bạn sử dụng biến môi trường trong Headerchỉ thị.


1
Bạn có nguồn nào để không đặt nhiều tiêu đề kiểm soát truy cập không? Tôi không thể tìm thấy bất cứ điều gì xác nhận điều này.
Spencer

Giải pháp rất thông minh và sạch sẽ. Đã làm cho tôi.
Alex Kalmikov

@Spencer "Lưu ý: Trong thực tế, việc sản xuất origin-list-or-null bị hạn chế nhiều hơn. Thay vì cho phép một danh sách gốc được phân tách bằng dấu cách, nó là một gốc duy nhất hoặc chuỗi" null " ." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

Tôi cũng có cả OWIN cũng như WebAPI của mình mà dường như cả hai đều cần CORS được kích hoạt riêng biệt, do đó đã tạo ra 'Access-Control-Allow-Origin' header contains multiple valueslỗi.

Tôi đã kết thúc việc xóa TẤT CẢ mã đã kích hoạt CORS và sau đó thêm phần sau vào system.webServernút của Web.Config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
  </customHeaders>
</httpProtocol>

Việc thực hiện này thỏa mãn các yêu cầu của CORS đối với OWIN (cho phép đăng nhập) và WebAPI (cho phép gọi API), nhưng nó đã tạo ra một vấn đề mới: OPTIONSkhông thể tìm thấy một phương pháp trong khi khởi hành cho các lệnh gọi API của tôi. Cách khắc phục điều đó rất đơn giản - tôi chỉ cần xóa phần sau khỏi handlersnút trên Web của tôi.Config:

<remove name="OPTIONSVerbHandler" />

Hy vọng điều này sẽ giúp ai đó.


7

Máy chủ Apache:

Tôi cũng chi tiêu như vậy, nhưng đó là do tôi không có dấu ngoặc kép (") dấu hoa thị trong tệp của tôi đã cung cấp quyền truy cập vào máy chủ, ví dụ: '.htaccess.':

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

Bạn cũng có thể có một tệp '.htaccess' trong một thư mục có một '.htaccess' khác, ví dụ:

/ 
- .htaccess 
- public_html / .htaccess (problem here)

Trong trường hợp của bạn, thay vì dấu hoa thị '*' sẽ là http://127.0.0.1:9000máy chủ ip ( ) mà bạn cấp quyền cung cấp dữ liệu.

ASP.NET:

Kiểm tra để đảm bảo không có bản sao 'Access-Control-Allow-Origin' trong mã của bạn.

Những công cụ phát triển:

Với Chrome, bạn có thể xác minh các tiêu đề yêu cầu của mình. Nhấn phím F12 và đi đến tab 'Mạng', bây giờ chạy yêu cầu AJAX và sẽ xuất hiện trên danh sách, nhấp vào và cung cấp tất cả thông tin ở đó.

Access-Control-Allow-Origin: *


Đôi khi nó dễ dàng như vậy ... Trong khi cố gắng làm cho những dịch vụ web bị nhiễu đó chạy trên IIS / Chrome, tôi đã thử với phương thức Application_BeginRequest và quên mất nó ... sự trùng lặp trong mã của riêng tôi! Cảm ơn đã chỉ cho tôi điều hiển nhiên! :)
Juergen Riemer

2
Để nhận được các tiêu đề phản hồi CORS, bạn cũng sẽ phải mô phỏng một yêu cầu có nguồn gốc chéo thực tế, vì vậy nó có thể không xuất hiện nếu bạn chỉ nhìn vào tab mạng trên trang web đang chạy. Tuy nhiên, việc sử dụng một cái gì đó như DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) để chạy yêu cầu AJAX của bạn về mặt kỹ thuật sẽ được gọi từ một miền khác, do đó sẽ kích hoạt CORS và cho phép bạn xem các tiêu đề Kiểm soát truy cập.
Henry C

4

Điều này xảy ra khi bạn có tùy chọn Cors được định cấu hình tại nhiều vị trí. Trong trường hợp của tôi, tôi đã có nó ở cấp bộ điều khiển cũng như trong Startup.Auth.cs / ConfigureAuth.

Sự hiểu biết của tôi là nếu bạn muốn nó ứng dụng rộng rãi thì chỉ cần cấu hình nó trong Startup.Auth.cs / ConfigureAuth như thế này ... Bạn sẽ cần tham khảo Microsoft.Owin.Cors

public void ConfigureAuth(IAppBuilder app)
        {
          app.UseCors(CorsOptions.AllowAll);

Nếu bạn muốn giữ nó ở cấp bộ điều khiển thì bạn có thể chỉ cần chèn ở cấp Bộ điều khiển.

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;

Trong trường hợp của tôi, tôi đã đặt nó trong cả Web.Config và MyAppApiConfig.cs. Xóa nó khỏi cái sau đã giải quyết được vấn đề cho tôi.
Jim B

4

nếu bạn đang ở trong IIS, bạn cần kích hoạt CORS trong web.config, sau đó bạn không cần kích hoạt trong phương thức Đăng ký App_Start / WebApiConfig.cs

Giải pháp của tôi là, nhận xét các dòng ở đây:

// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);

và viết trong web.config:

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


2

Tất nhiên, điều này cũng có thể xảy ra nếu bạn thực sự đặt Access-Control-Allow-Origintiêu đề của mình có nhiều giá trị - Ví dụ: danh sách các giá trị được phân tách bằng dấu phẩy, được hỗ trợ trong RFC nhưng thực sự không được hỗ trợ bởi hầu hết các trình duyệt chính. Lưu ý rằng RFC cũng nói về cách cho phép nhiều miền mà không cần sử dụng '*'.

Ví dụ: bạn có thể gặp lỗi đó trong Chrome bằng cách sử dụng tiêu đề như sau:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

Đây là trong Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Lưu ý rằng nếu bạn đang xem xét điều này vì CDN và bạn sử dụng Akamai, bạn có thể muốn lưu ý rằng Akamai sẽ không lưu vào bộ nhớ cache trên máy chủ nếu bạn sử dụng Vary:Origin , theo cách mà nhiều người đề xuất để giải quyết vấn đề này.

Có thể bạn sẽ phải thay đổi cách tạo khóa bộ nhớ cache của mình, sử dụng hành vi phản hồi "Sửa đổi ID bộ nhớ cache". Thêm chi tiết về vấn đề này trong câu hỏi liên quan đến StackOverflow này


Vì vậy, về cơ bản, bạn không thể ngay bây giờ vì có thể nghi ngờ rằng bạn sẽ muốn mọi tên miền duy nhất trên internet đạt được url.
scottheckel

Các liên kết Akamai đòi hỏi phải đăng nhập.
Jean-François Savard

vâng, điều đó dường như là một yêu cầu akamai đối với những tài liệu đó ;-(
Brad Parks

Một cách khác để nhận được lỗi này trong Chrome là với một danh sách không gian tách ra các giá trị: Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com. Đó sẽ là cách chính xác, nhưng các trình duyệt không tuân theo tiêu chuẩn ở đây ( nguồn ).
tanius

2

Thật ngu ngốc và đơn giản:

Sự cố này xảy ra với tôi khi có hai lần Header always set Access-Control-Allow-Origin *bên trong tệp cấu hình Apache của tôi. Sau khi quét các VirtualHostthẻ và một lần bên trong Limitthẻ:

<VirtualHost localhost:80>
  ...
  Header set Access-Control-Allow-Origin: *
  ...
  <Limit OPTIONS>
    ...
    Header set Access-Control-Allow-Origin: *
    ...
  </Limit>
</VirtualHost>

Xóa một mục nhập đã giải quyết được sự cố.

Tôi đoán trong bài đăng ban đầu, nó sẽ là hai lần:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"

1

vừa gặp sự cố này với máy chủ nodejs.

đây là cách tôi sửa nó.
tôi chạy máy chủ nút của mình thông qua a nginx proxyvà tôi đặt nginx và nodecho cả hai allow cross domain requestsvà nó không như vậy nên tôi đã xóa nó khỏi nginx và để nó trong nút và tất cả đều ổn.


Cảm ơn bạn vì câu trả lời này! Nó đã giải quyết một vấn đề mà tôi không thể giải quyết trong một thời gian dài với thiết lập nginx + Rack (Ruby). Cùng một vấn đề, cùng một giải pháp: Tắt bổ sung tiêu đề trong nginx và để rack-corsviên ngọc xử lý nội dung CORS. Bam, đã sửa.
Pistos

0

Tôi đã gặp phải vấn đề tương tự và đây là những gì tôi đã làm để giải quyết nó:

Trong dịch vụ WebApi, bên trong Global.asax, tôi đã viết đoạn mã sau:

Sub Application_BeginRequest()
        Dim currentRequest = HttpContext.Current.Request
        Dim currentResponse = HttpContext.Current.Response

        Dim currentOriginValue As String = String.Empty
        Dim currentHostValue As String = String.Empty

        Dim currentRequestOrigin = currentRequest.Headers("Origin")
        Dim currentRequestHost = currentRequest.Headers("Host")

        Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
        Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")

        If currentRequestOrigin IsNot Nothing Then
            currentOriginValue = currentRequestOrigin
        End If

        If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
            currentResponse.Headers.Remove("Access-Control-Allow-Origin")
            currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
        End If

        For Each key In Request.Headers.AllKeys
            If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
                currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
                currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
                currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
                currentResponse.StatusCode = 200
                currentResponse.End()
            End If
        Next

    End Sub

Ở đây mã này chỉ cho phép yêu cầu trước chuyến bay và mã thông báo để thêm "Access-Control-Allow-Origin" trong phản hồi, nếu không tôi sẽ không thêm nó.

Đây là blog của tôi về việc triển khai: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /


0

đối với những người đang sử dụng IIS với php, trên IIS phía máy chủ cập nhật tệp web.config nó thư mục gốc (wwwroot) và thêm tệp này

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <httpProtocol>
            <customHeaders>
                <add name="Control-Allow-Origin" value="*"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

sau đó khởi động lại máy chủ IIS, nhập IISReset trong RUN và nhập


0

Đây là một ví dụ khác tương tự như các ví dụ trên mà bạn có thể chỉ có một tệp cấu hình xác định CORS ở đâu: Có hai tệp web.config trên máy chủ IIS trên đường dẫn trong các thư mục khác nhau và một trong số chúng bị ẩn trong thư mục ảo. Để giải quyết vấn đề này, tôi đã xóa tệp cấu hình mức gốc vì đường dẫn đang sử dụng tệp cấu hình trong thư mục ảo. Phải chọn cái này hay cái kia.

URL called:  'https://example.com/foo/bar'
                     ^              ^
      CORS config file in root      virtual directory with another CORS config file
          deleted this config             other sites using this


0

Tiêu đề 'Access-Control-Allow-Origin' chứa nhiều giá trị

khi tôi nhận được lỗi này, tôi đã dành hàng tấn hàng giờ để tìm kiếm giải pháp cho vấn đề này nhưng không có gì hoạt động, cuối cùng tôi đã tìm thấy giải pháp cho vấn đề này rất đơn giản. khi tiêu đề '' Access-Control-Allow-Origin 'được thêm nhiều lần vào phản hồi của bạn, lỗi này xảy ra, hãy kiểm tra apache.conf hoặc httpd.conf (máy chủ Apache), tập lệnh phía máy chủ và xóa tiêu đề mục nhập không mong muốn khỏi các tệp này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.