1

이것을 이해하기 위해 나는 asp.net 의 샘플 응용 프로그램을 사용하고 있으며이를 실행하고 예제 페이지를 사용하면 모든 것이 잘 작동합니다.asp.net app from api, Oauth 인증

그런 다음 mvc 스캐 폴딩을 사용하는 새 빈 asp.net 프로젝트를 만들고 2 개의 다른 레이어로 시나리오를 다시 만듭니다. 나는이 양식 작업을 사용하여 등록 할 수있어 :

<form method="post" action="https://localhost:44305/api/Account/Register"> 
     <h3>Register</h3> 
     <div class="form-group"> 
      <label>Email</label> 
      @Html.TextBoxFor(m => m.Email, new { id = "txtUserName", @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <label>Password</label> 
      @Html.PasswordFor(m => m.Password, new { id = "txtPassword", @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <label>Confirm Password</label> 
      @Html.PasswordFor(m => m.ConfirmPassword, new { id = "txtConfirmPassword", @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <button type="submit" class="btn btn-default">Register</button> 
     </div> 
    </form> 

을하지만 난 때 그것은 내가 쿼리 문자열로 입력 한 사용자 이름/암호와 같은 페이지로 리디렉션 로그인하기 : (http://localhost:57972/?Email=username&Password=password)

 <div class="form-group"> 
      <label>Email</label> 
      @Html.TextBoxFor(m => m.Email, new { id = "txtloginUserName", @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <label>Password</label> 
      @Html.PasswordFor(m => m.Password, new { id = "txtloginPassword", @class = "form-control" }) 
     </div> 
     <div class="form-group"> 
      <button id="btnLogin" class="btn btn-default">Log In</button> 
     </div> 
<script> 
    var token = ""; 
    $('#btnLogin').click(function() { 
     var username = $('#txtloginUserName').val(); 
     var password = $('#txtloginPassword').val(); 

     $.ajax({ 
      type: 'POST', 
      url: 'http://localhost:26812/Token', 
      contentType: 'application/x-www-form-urlencoded; charset=UTF-8', 
      data: { 
       grant_type: 'password', 
       username: username, 
       password: password 
      }, 
      success: function (data) { 
       token = data.access_token; 
      } 
     }) 
    }); 
</script> 

** 업데이트

내가/Token에 대한 전체 URL을 호출해야한다는 것을 깨달았으며 이제 로그인하여 네트워크 상태를 200 OK 코드로 응답하지만 콘솔에서 오류가 발생합니다. "아니오 'Access-Control-Allow-Origin'헤더 요청한 자원에 있습니다. 원산지 'http://localhost:57972는'그러므로 액세스가 허용되지 않는다 "

내 webapiconfig에 config.EnableCors()를 추가 한, 내가 테스트 목적으로 모두 허용하는 내 apicontroller에 주석을 추가 한 :.

[EnableCors(origins: "*", headers:"*", methods:"*")] 

Picture of the network response and error:

+0

확인하는 것은'사전 fligh에서 아무 '액세스 제어 - 허용 - Origin'' 오류입니다 'OPTIONS' 요청, 맞죠? – Searching

+0

이상한 부분은 POST 요청 자체가 OK를 반환하고 그 오류를 throw하지만 로그에는 한 요청 만 표시되며 POST입니다. –

+0

MVC API를 사용하여'Access-Control-Allow-Origin'을 둘러싼 많은 질문이 있습니다. OPTIONS에서이 기능을 사용하지 않는 것이 좋습니다. ajax 요청의'datatype'을'dataType : "jsonp"'으로 설정하고 아직도이 문제가 있는지보십시오. – Searching

답변

0

시도는 Global.asax에이 방법을 추가 :

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, DELETE, PUT"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Authentication"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "86400"); 
      HttpContext.Current.Response.End(); 
     } 
     else 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, DELETE"); 
     } 
    }