ข้อผิดพลาด: ช่องส่วนหัวของคำขอประเภทเนื้อหาไม่ได้รับอนุญาตโดย Access-Control-Allow-Headers


102

ฉันสร้างโครงการ mvc4 web api โดยใช้ vS2012 ฉันใช้บทช่วยสอนต่อไปนี้เพื่อแก้ปัญหา Cross-Origin Resource Sharing "http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api- rc-version.aspx ". ทำงานได้สำเร็จและฉันโพสต์ข้อมูลจากฝั่งไคลเอ็นต์ไปยังเซิร์ฟเวอร์เรียบร้อยแล้ว

หลังจากนั้นสำหรับการใช้ Autherization ในโปรเจ็กต์ของฉันฉันใช้บทช่วยสอนต่อไปนี้เพื่อติดตั้ง OAuth2 "http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/18/oauth-2-0-for -mvc- สองขา -plement.aspx " นี่คือความช่วยเหลือฉันในการรับ RequestToken ทางฝั่งไคลเอ็นต์

แต่เมื่อฉันโพสต์ข้อมูลจากฝั่งไคลเอ็นต์ฉันได้รับข้อผิดพลาด "XMLHttpRequest ไม่สามารถโหลด http: // ช่องส่วนหัวของคำขอ Content-Type ไม่ได้รับอนุญาตโดย Access-Control-Allow-Headers"

รหัสฝั่งไคลเอ็นต์ของฉันมีลักษณะดังนี้

 function PostLogin() {
    var Emp = {};            
    Emp.UserName = $("#txtUserName").val();             
    var pass = $("#txtPassword").val();
    var hash = $.sha1(RequestToken + pass);
            $('#txtPassword').val(hash);
    Emp.Password= hash;
    Emp.RequestToken=RequestToken;
    var createurl = "http://localhost:54/api/Login";
    $.ajax({
        type: "POST",
        url: createurl,
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(Emp),
        statusCode: {
                200: function () {
                $("#txtmsg").val("done");                       
                toastr.success('Success.', '');                         
                }
                },
        error:
            function (res) {                        
                toastr.error('Error.', 'sorry either your username of password was incorrect.');            
                }
        });
    };

ตัวควบคุม apiของฉันดูเหมือน

    [AllowAnonymous]
    [HttpPost]
    public LoginModelOAuth PostLogin([FromBody]LoginModelOAuth model)
    {
        var accessResponse = OAuthServiceBase.Instance.AccessToken(model.RequestToken, "User", model.Username, model.Password, model.RememberMe);

        if (!accessResponse.Success)
        {
            OAuthServiceBase.Instance.UnauthorizeToken(model.RequestToken);
            var requestResponse = OAuthServiceBase.Instance.RequestToken();

            model.ErrorMessage = "Invalid Credentials";

            return model;
        }
        else
        {
            // to do return accessResponse

            return model;
        }

    } 

ไฟล์webconfigของฉันดูเหมือน

 <configuration>
   <configSections>   
   <section name="entityFramework"    type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <section name="oauth" type="MillionNodes.Configuration.OAuthSection, MillionNodes, Version=1.0.0.0, Culture=neutral"/>
  <sectionGroup name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection, DotNetOpenAuth.Core">
  <section name="messaging" type="DotNetOpenAuth.Configuration.MessagingElement, DotNetOpenAuth.Core" requirePermission="false" allowLocation="true" />
  <section name="reporting" type="DotNetOpenAuth.Configuration.ReportingElement, DotNetOpenAuth.Core" requirePermission="false" allowLocation="true" />
</sectionGroup>
</configSections>
<oauth defaultProvider="DemoProvider" defaultService="DemoService">
<providers>
  <add name="DemoProvider" type="MillionNodes.OAuth.DemoProvider, MillionNodes" />
</providers>
<services>
  <add name="DemoService" type="MillionNodes.OAuth.DemoService, MillionNodes" />
</services>
</oauth>
<system.web>
 <httpModules>
   <add name="OAuthAuthentication" type="MillionNodes.Module.OAuthAuthenticationModule, MillionNodes, Version=1.0.0.0, Culture=neutral"/>
  </httpModules>
 <compilation debug="true" targetFramework="4.0" />
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<pages>
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>
</system.web>
<system.webServer>
 <validation validateIntegratedModeConfiguration="false" />      
  <modules>
      <add name="OAuthAuthentication"     type="MillionNodes.Module.OAuthAuthenticationModule, MillionNodes, Version=1.0.0.0, Culture=neutral" preCondition="" />
 </modules>
 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
  </httpProtocol>
</system.webServer>
<dotNetOpenAuth>
<messaging>
  <untrustedWebRequest>
    <whitelistHosts>
      <!-- Uncomment to enable communication with localhost (should generally not activate in production!) -->
      <!--<add name="localhost" />-->
    </whitelistHosts>
  </untrustedWebRequest>
</messaging>
<!-- Allow DotNetOpenAuth to publish usage statistics to library authors to improve the library. -->
<reporting enabled="true" />


ลองดูที่stackoverflow.com/questions/5027705/…นี้และเพิ่มกฎอื่นในการกำหนดค่าเว็บของคุณ
Mark Jones

สวัสดีคุณกำลังทดสอบ js นี้โดยตรงจากเบราว์เซอร์และระบบไฟล์ในเครื่องเช่นไฟล์: // URL ?? และจากเบราว์เซอร์ใด
Mark Jones

คำตอบ:


170

ตามคำแนะนำในโพสต์นี้ข้อผิดพลาดใน chrome: Access-Control-Allow-Headersไม่อนุญาตให้ใช้เนื้อหาเพียงแค่เพิ่มส่วนหัวเพิ่มเติมใน web.config ของคุณเช่นนั้น ...

<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>

ขอบคุณสำหรับการตอบ. ได้ลองสิ่งนี้ แต่ฉันได้รับข้อผิดพลาด "XMLHttpRequest ไม่สามารถโหลดlocalhost: 54 / api / Login Access-Control-Allow-Origin ไม่อนุญาตให้ใช้ Origin null"
Kishore


ฉันยังไม่มีโชคกับสิ่งนี้ฉันได้โพสต์รายละเอียดไว้ที่นี่: stackoverflow.com/questions/12437748/…
Kishore

112

เป็นไปได้มากว่าเกิดจากการร้องขอข้ามแหล่งกำเนิดแต่อาจไม่ใช่ สำหรับฉันฉันได้รับการดีบัก API และได้ตั้งAccess-Control-Allow-Originไป*แต่ปรากฏว่ารุ่นล่าสุดของ Chrome ได้รับการกำหนดให้ส่วนหัวเป็นพิเศษ ลองเติมสิ่งต่อไปนี้ลงในไฟล์ของคุณหากคุณใช้ PHP:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

ตรวจสอบให้แน่ใจว่าคุณยังไม่ได้ใช้headerในไฟล์อื่นมิฉะนั้นคุณจะได้รับข้อผิดพลาดที่น่ารังเกียจ ดูเอกสารเพิ่มเติม


3
ทำไมดอกจันไม่ครอบคลุมทุกอย่าง - -;
user2483724

3
@ user2483724 นั่นเป็นเพราะเครื่องหมายดอกจันอนุญาตโดเมน Origin ใด ๆ แต่ไม่ได้ระบุว่าอนุญาตให้ใช้ส่วนหัวเพิ่มเติมใด เพียงแค่บอกว่า 'คุณสามารถเรียกสคริปต์นี้ได้จากหน้าที่ทำงานที่อื่น'
Garet Claborn

18

ฉันรู้ว่ามันเป็นกระทู้เก่าที่ฉันใช้กับคำตอบข้างต้นและต้องเพิ่ม:

header('Access-Control-Allow-Methods: GET, POST, PUT');

ส่วนหัวของฉันดูเหมือนว่า:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT');

และปัญหาได้รับการแก้ไข


10

สำหรับ Nginx สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือการเพิ่มส่วนหัวนี้:

add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since';

พร้อมกับส่วนหัว Access-Control-Allow-Origin:

add_header 'Access-Control-Allow-Origin' '*';

จากนั้นโหลดการกำหนดค่า nginx ใหม่และใช้งานได้ดี เครดิตhttps://gist.github.com/algal/5480916 .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.