2013-10-31 6 views
1

jsonp가 아닌 json을 반환하는 페이지에 ajax 호출 (IE 10 사용)을 시도하고 있지만 "401 - Unauthorized : 잘못된 자격 증명으로 인해 액세스가 거부되었습니다." 이 사이트는 IIS에서 "Windows 인증"을 사용하도록 설정되어 있지만 익명 인증을 사용하도록 사이트를 변경하면 호출이 작동합니다. 아래 코드는 제가 전화를 걸 때 사용하고있는 코드입니다. 내 전화로 무엇을 놓쳤는가 또는 내 웹 서버에서 무엇을 변경해야합니까? Windows 인증은 현재 Windows Auth에서 NTLM 인증을 사용하도록 설정되어 있습니다.ajax 호출 전달 보안

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <script src="scripts/jquery-2.0.3.min.js"></script> 
    <script src="scripts/base64.js"></script> 
    <script type="text/javascript"> 
     function QueryMyData() { 
      var postUrl = 'http://mydevpage/storage.ashx'; 
      var data = 'AssetNumber=102405'; 
      $.support.cors = true; 
      $.ajax({ 
       type: "POST", 
       url: postUrl, 
       data: data, 
       dataType: 'json', 
       crossDomain: true, 
       cache: false, 
       username: "mydomain.net\\myuser", 
       password: "password", 
       beforeSend: function (xhr) { 
        xhr.withCredentials = true; 

       }, 
       success: function (result) { 
        if (result) { 
         if (result.error) 
          alert(result.error); 
         else 
          alert(result.id); 
        } 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert('Unknow Error:' + thrownError + ajaxOptions + xhr.status + " " + xhr.statusText); 
       } 
      }); 
     } 
     QueryMyData(); 
    </script> 
</head> 
<body> 
</body> 
</html> 
+0

잘 한 것은'이다 프록시 페이지 (ProxyHandler.ashx)는 '가능성이 잘못 "mydomain.net 참고 MyUser \"; 아마도 "mydomain.net \\ myuser"'이어야합니다. – Pointy

+2

'username = "mydomain.net \ myuser", 그리고 다음 줄은 유효하지 않으며,'crossDomain'은 필요하지 않습니다.'$ .support.cors'는 필요하지 않습니다. scripts/jquery-2.0.3.min. js는 IE8에서 작동하지 않으며, CORS는 플러그인이없는 jQuery와 함께 IE8에서 작동하지 않습니다. 여기에는 너무 많은 잘못이 있습니다. –

+2

또 다른 한가지는'username : "...",','username = "...",' –

답변

1

문제점에 대한 해결책을 찾았습니다. 다른 도메인의 페이지를 때리는 보안 작업을 아약스 요청에받을 수 없었지만이 작업을 수행하는 방법을 찾았습니다. 결국 ProxyHandler.ashx 페이지를 만들고 WebClient를 사용하여 요청에 대한 권한을 설정했습니다.

HTML 페이지

여기
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
    <script type="text/javascript"> 
     function QueryMyData() { 
      var postUrl = './ProxyHandler.ashx?http://mydevpage/storage.ashx'; 
      var data = 'AssetNumber=102405'; 
      $.support.cors = true; 
      $.ajax({ 
       type: "POST", 
       url: postUrl, 
       data: data, 
       dataType: 'json', 
       cache: false, 
       success: function (result) { 
        if (result) { 
         if (result.error) 
          alert(result.error); 
         else 
          alert(result.id); 
        } 
       }, 
       error: function (xhr, ajaxOptions, thrownError) { 
        alert('Unknow Error:' + thrownError + ajaxOptions + xhr.status + " " + xhr.statusText); 
       } 
      }); 
     } 
     QueryMyData(); 
    </script> 
</head> 
<body> 
</body> 
</html> 

public class ProxyHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     string username = "svcMyServiceAccount"; 
     string password = "password"; 
     try 
     { 
      string uri = context.Request.RawUrl.Substring(context.Request.RawUrl.IndexOf("?") + 1); 

      if (uri.StartsWith("ping")) 
      { 
       context.Response.Write("<html><body>Hello ProxyHandler</body></html>"); 
       return; 
      } 

      context.Response.ContentType = "text/plain"; 

      byte[] bytes = new byte[context.Request.InputStream.Length]; 
      context.Request.InputStream.Read(bytes, 0, (int)context.Request.InputStream.Length); 
      var data = System.Text.Encoding.UTF8.GetString(bytes); 

      using (System.Net.WebClient wc = new System.Net.WebClient()) 
      { 
       wc.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
       //this is the magic of getting auth passed. See post http://stackoverflow.com/questions/1680718/domain-credentials-for-a-webclient-class-dont-work 
       wc.Credentials = CreateCredientialCached(uri, username, password, "mydomain"); 
       var response = wc.UploadString(new Uri(uri, UriKind.Absolute), "POST", data); 
       context.Response.Write(response); //already in the JSON Reponse class format 
      } 
     } 
     catch (Exception e) 
     { 
      context.Response.Write(GetJSON(string.Empty, e)); 
     } 
    } 

    private CredentialCache CreateCredientialCached(string uri, string userName, string userPassword, string domain) 
    { 
     CredentialCache cc = new CredentialCache(); 
     cc.Add(new Uri(uri), "NTLM", new NetworkCredential(userName, userPassword, domain)); 
     return cc; 
    } 

    private string GetJSON(string id, Exception error) 
    { 
     var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new Response() { id = id, error = error != null ? error.ToString() : string.Empty }); 
     return json; 
    } 

    // Necessary for IHttpHandler implementation 
    public bool IsReusable 
    { 
     get { return false; } 
    } 

    private class Response 
    { 
     public string id { get; set; } 
     public string error { get; set; } 
    }; 
} 
+0

내 상황이 정확히 동일하지는 않지만 WebClient를 사용하여 관련 아약스 문제를 해결할 수있는 답을 얻었습니다. –