오류 : 요청 헤더 필드 Content-Type은 Access-Control-Allow-Headers에서 허용되지 않습니다.


102

vS2012를 사용하여 mvc4 웹 API 프로젝트를 만들었습니다. 다음 자습서를 사용하여 Cross-Origin 리소스 공유를 해결했습니다. "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-two-legged-implementation.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를 브라우저와 로컬 파일 시스템 (예 : file : // URL.?)에서 직접 테스트하고 있습니까? 그리고 어떤 브라우저에서?
Mark Jones

답변:


170

이 게시물에서 알 수 있듯이 Chrome의 오류 : Access-Control-Allow-Headers에서 Content-Type을 허용하지 않습니다. 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을 로드 할 수 없습니다 . Origin null은 Access-Control-Allow-Origin에서 허용되지 않습니다. "라는 오류가 발생했습니다 .
Kishore


나는 아직도이와 운이없는거야, 난 여기에 자세히 게시 : stackoverflow.com/questions/12437748/...
키 쇼어

112

출처 간 요청 때문일 가능성이 높지만 그렇지 않을 수도 있습니다. 나를 위해, 나는 API를 디버깅했다과를 설정했다 Access-Control-Allow-Origin으로 *,하지만 크롬의 최신 버전은 추가 헤더를 필요로하는 것으로 보인다. 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.