Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax调用传递安全性_Javascript_Jquery_Ajax_Security - Fatal编程技术网

Javascript ajax调用传递安全性

Javascript ajax调用传递安全性,javascript,jquery,ajax,security,Javascript,Jquery,Ajax,Security,我正在尝试(使用IE 10)对返回json(而不是jsonp)的页面进行ajax调用,但我不断得到“401-未经授权:由于凭据无效,访问被拒绝”。该站点在IIS中设置为使用“Windows身份验证”,但是,如果我更改该站点以启用匿名身份验证,则该调用将起作用。下面是我用来打电话的代码。我的呼叫遗漏了什么,或者我需要在Web服务器上更改什么?Windows身份验证当前设置为在Windows身份验证上使用NTLM身份验证 <!DOCTYPE html> <html xmlns="h

我正在尝试(使用IE 10)对返回json(而不是jsonp)的页面进行ajax调用,但我不断得到“401-未经授权:由于凭据无效,访问被拒绝”。该站点在IIS中设置为使用“Windows身份验证”,但是,如果我更改该站点以启用匿名身份验证,则该调用将起作用。下面是我用来打电话的代码。我的呼叫遗漏了什么,或者我需要在Web服务器上更改什么?Windows身份验证当前设置为在Windows身份验证上使用NTLM身份验证

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

函数QueryMyData(){
姿态变量http://mydevpage/storage.ashx';
var数据='AssetNumber=102405';
$.support.cors=true;
$.ajax({
类型:“POST”,
网址:postrl,
数据:数据,
数据类型:“json”,
跨域:是的,
cache:false,
用户名:“mydomain.net\\myuser”,
密码:“密码”,
发送前:函数(xhr){
xhr.withCredentials=true;
},
成功:功能(结果){
如果(结果){
if(result.error)
警报(结果错误);
其他的
警报(result.id);
}
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(“未知错误:”+thrownError+ajaxOptions+xhr.status+“”+xhr.statusText);
}
});
}
QueryMyData();

我找到了解决问题的方法。虽然我无法让ajax请求处理另一个域上的页面的安全性,但我确实找到了一种方法来实现这一点。我最终创建了一个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>

函数QueryMyData(){
var postrl='./ProxyHandler.ashx?http://mydevpage/storage.ashx';
var数据='AssetNumber=102405';
$.support.cors=true;
$.ajax({
类型:“POST”,
网址:postrl,
数据:数据,
数据类型:“json”,
cache:false,
成功:功能(结果){
如果(结果){
if(result.error)
警报(结果错误);
其他的
警报(result.id);
}
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(“未知错误:”+thrownError+ajaxOptions+xhr.status+“”+xhr.statusText);
}
});
}
QueryMyData();
这是代理页面(ProxyHandler.ashx)

public类代理处理程序:IHttpHandler
{
公共void ProcessRequest(HttpContext上下文)
{
字符串username=“svcMyServiceAccount”;
字符串password=“password”;
尝试
{
字符串uri=context.Request.RawUrl.Substring(context.Request.RawUrl.IndexOf(“?”)+1);
if(uri.StartsWith(“ping”))
{
Write(“Hello ProxyHandler”);
返回;
}
context.Response.ContentType=“text/plain”;
byte[]bytes=新字节[context.Request.InputStream.Length];
读取(字节,0,(int)context.Request.InputStream.Length);
var data=System.Text.Encoding.UTF8.GetString(字节);
使用(System.Net.WebClient wc=new System.Net.WebClient())
{
wc.Headers[“内容类型”]=“应用程序/x-www-form-urlencoded”;
//这就是通过认证的神奇之处。请参阅帖子http://stackoverflow.com/questions/1680718/domain-credentials-for-a-webclient-class-dont-work
Credentials=createCredentialCached(uri、用户名、密码,“mydomain”);
var response=wc.UploadString(新Uri(Uri,UriKind.Absolute),“POST”,数据);
context.Response.Write(Response);//已经是JSON响应类格式
}
}
捕获(例外e)
{
Write(GetJSON(string.Empty,e));
}
}
private CredentialCache CreateCredentialCached(字符串uri、字符串用户名、字符串用户密码、字符串域)
{
CredentialCache cc=新的CredentialCache();
cc.Add(新Uri(Uri),“NTLM”,新网络凭证(用户名、用户密码、域));
返回cc;
}
私有字符串GetJSON(字符串id,异常错误)
{
var json=new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(新响应(){id=id,error=error!=null?error.ToString():string.Empty});
返回json;
}
//IHttpHandler实现所必需的
公共布尔可重用
{
获取{return false;}
}
私有类响应
{
公共字符串id{get;set;}
公共字符串错误{get;set;}
};
}

我找到了解决问题的方法。虽然我无法让ajax请求处理另一个域上的页面的安全性,但我确实找到了一种方法来实现这一点。我最终创建了一个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>

函数QueryMyData(){
var postrl='./ProxyHandler.ashx?http://mydevpage/storage.ashx';
var数据='AssetNumber=102405';
$.support.cors=true;
$.ajax({
类型:“POST”,
网址:postrl,
数据:数据,
数据类型:“json”,