Errore: il campo dell'intestazione della richiesta Content-Type non è consentito da Access-Control-Allow-Headers


102

Ho creato un progetto API Web mvc4 utilizzando vS2012. Ho utilizzato il seguente tutorial per risolvere la condivisione delle risorse tra le origini, "http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api- rc-version.aspx". Funziona correttamente e inserisco i dati dal lato client al server con successo.

Successivamente per l'implementazione dell'autherization nel mio progetto, ho utilizzato il seguente tutorial per implementare OAuth2, "http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/18/oauth-2-0-for -mvc-due gambe-implementation.aspx". Questo mi aiuta a ottenere RequestToken dal lato client.

Ma quando inserisco i dati dal lato client, ho ricevuto l'errore "XMLHttpRequest non può caricare http: //. Il campo di intestazione della richiesta Content-Type non è consentito da Access-Control-Allow-Headers."

Il mio codice lato client assomiglia,

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

Il mio controller API assomiglia,

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

    } 

Il mio file webconfig assomiglia,

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


Dai un'occhiata a questo stackoverflow.com/questions/5027705/… e aggiungi un'altra regola nella tua configurazione web
Mark Jones,

Ciao, stai testando questo js direttamente dal tuo browser e dal file system locale, ad esempio file: // URL. ?? E da quale browser?
Mark Jones

Risposte:


170

Come suggerito da questo post Errore in chrome: Content-Type non è consentito da Access-Control-Allow-Headers basta aggiungere l'intestazione aggiuntiva al tuo web.config in questo modo ...

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

Grazie per la risposta. Ha provato ma ho ricevuto l'errore "XMLHttpRequest non può caricare localhost: 54 / api / Login . Origin null non è consentito da Access-Control-Allow-Origin."
Kishore


Non ho ancora fortuna con questo, ho pubblicato in dettaglio qui: stackoverflow.com/questions/12437748/…
Kishore

112

Molto probabilmente è dovuto a una richiesta cross-origin , ma potrebbe non esserlo. Per quanto mi riguarda, stavo eseguendo il debug di un'API e avevo impostato Access-Control-Allow-Originsu *, ma sembra che le versioni recenti di Chrome richiedano un'intestazione aggiuntiva. Prova ad anteporre quanto segue al tuo file se stai usando PHP:

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

Assicurati di non averlo già utilizzato headerin un altro file, altrimenti riceverai un brutto errore. Vedi i documenti per ulteriori informazioni.


3
Perché l'asterisco non copre tutto - -;
user2483724

3
@ user2483724 perché l'asterisco consente qualsiasi dominio di origine, ma non specifica quali intestazioni aggiuntive sono consentite. Dice solo "puoi chiamare questo script da una pagina in esecuzione da qualche altra parte"
Garet Claborn,

18

So che è un vecchio thread con cui ho lavorato sopra la risposta e ho dovuto aggiungere:

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

Quindi la mia intestazione ha questo aspetto:

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

E il problema è stato risolto.


10

Per Nginx, l'unica cosa che ha funzionato per me è stata l'aggiunta di questa intestazione:

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

Insieme all'intestazione Access-Control-Allow-Origin:

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

Quindi ha ricaricato la configurazione di nginx e ha funzionato alla grande. Credito https://gist.github.com/algal/5480916 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.