Kesalahan: Bidang tajuk permintaan Jenis Konten tidak diizinkan oleh Access-Control-Allow-Headers


102

Saya membuat proyek api web mvc4 menggunakan vS2012. Saya menggunakan tutorial berikut untuk menyelesaikan Cross-Origin Resource Sharing, "http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api- rc-version.aspx ". Ini bekerja dengan sukses, dan saya memposting data dari sisi klien ke server dengan sukses.

Setelah itu untuk mengimplementasikan Autherization dalam proyek saya, saya menggunakan tutorial berikut untuk mengimplementasikan OAuth2, "http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/18/oauth-2-0-for -mvc-two-legged-execution.aspx ". Ini membantu saya untuk mendapatkan RequestToken di sisi klien.

Tetapi ketika saya memposting data dari sisi klien, saya mendapat kesalahan, "XMLHttpRequest tidak dapat memuat http: //. Bidang header permintaan Jenis Konten tidak diizinkan oleh Access-Control-Allow-Headers."

Kode sisi klien saya terlihat seperti,

 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.');            
                }
        });
    };

Pengontrol api saya terlihat seperti,

    [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;
        }

    } 

File webconfig saya terlihat seperti,

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


Lihat stackoverflow.com/questions/5027705/… ini dan tambahkan aturan lain di konfigurasi web Anda
Mark Jones

Hai, apakah Anda menguji js ini langsung dari browser dan sistem file lokal misalnya file: // URL. ?? Dan dari browser mana?
Mark Jones

Jawaban:


170

Seperti yang diisyaratkan oleh posting ini Kesalahan di chrome: Jenis-Konten tidak diizinkan oleh Access-Control-Allow-Headers cukup tambahkan tajuk tambahan ke web.config Anda seperti ...

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

Terima kasih atas balasannya. Ini mencoba ini tetapi saya mendapat kesalahan, "XMLHttpRequest tidak dapat memuat localhost: 54 / api / Login . Asal null tidak diizinkan oleh Access-Control-Allow-Origin."
Kishore


Saya masih tidak beruntung dengan ini, saya telah memposting secara rinci di sini: stackoverflow.com/questions/12437748/…
Kishore

112

Kemungkinan besar karena permintaan lintas sumber , tetapi mungkin tidak. Bagi saya, saya telah men-debug API dan telah menyetel Access-Control-Allow-Originke *, tetapi tampaknya versi Chrome terbaru memerlukan header tambahan. Coba prepending yang berikut ini ke file Anda jika Anda menggunakan PHP:

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

Pastikan Anda belum pernah menggunakan headerfile lain, atau Anda akan mendapatkan error yang parah. Lihat dokumen untuk lebih lanjut.


3
Mengapa tanda bintang tidak menutupi semuanya - -;
pengguna2483724

3
@ user2483724 itu karena tanda bintang mengizinkan domain Asal apa pun, tetapi tidak menentukan tajuk tambahan mana yang diizinkan. Itu hanya mengatakan, 'Anda dapat memanggil skrip ini dari halaman yang berjalan di tempat lain'
Garet Claborn

18

Saya tahu ini adalah utas lama yang saya kerjakan dengan jawaban di atas dan harus menambahkan:

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

Jadi header saya terlihat seperti:

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');

Dan masalahnya sudah diperbaiki.


10

Untuk Nginx, satu-satunya hal yang berhasil untuk saya adalah menambahkan tajuk ini:

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

Bersama dengan header Access-Control-Allow-Origin:

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

Kemudian muat ulang konfigurasi nginx dan itu berfungsi dengan baik. Kredit https://gist.github.com/algal/5480916 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.