Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Jquery CORS:访问需要身份验证的web服务(ASP.NET表单)_Jquery_Asp.net_Authentication_Cookies_Cross Domain - Fatal编程技术网

Jquery CORS:访问需要身份验证的web服务(ASP.NET表单)

Jquery CORS:访问需要身份验证的web服务(ASP.NET表单),jquery,asp.net,authentication,cookies,cross-domain,Jquery,Asp.net,Authentication,Cookies,Cross Domain,我正在尝试在现有的asp.net网站上启用CORS,该网站承载多个WCF服务。不幸的是,我很难做到这一点。乍一看,我被重定向到登录页面(该页面不存在),因此自定义身份验证服务生成的身份验证cookie可能有问题 在继续之前,以下是对我当前场景的简单描述: 我有一个站点A,它公开了几个web服务(除了 身份验证服务只能由经过身份验证的用户访问), 还有站点B,它有一个试图与web交互的页面 服务 为了复制这个场景,我将 服务+html页面在同一个地方,我创建了一个别名 (hosts文件)以模拟c

我正在尝试在现有的asp.net网站上启用CORS,该网站承载多个WCF服务。不幸的是,我很难做到这一点。乍一看,我被重定向到登录页面(该页面不存在),因此自定义身份验证服务生成的身份验证cookie可能有问题

在继续之前,以下是对我当前场景的简单描述:

  • 我有一个站点A,它公开了几个web服务(除了 身份验证服务只能由经过身份验证的用户访问), 还有站点B,它有一个试图与web交互的页面 服务
  • 为了复制这个场景,我将 服务+html页面在同一个地方,我创建了一个别名 (hosts文件)以模拟cors调用(假设我 称之为outro.pt)
  • 身份验证cookie是通过使用 FormsAuthentication.GetAuthCookie,然后将其添加到 通过调用response.AppendCookie方法进行响应
  • 身份验证按预期工作:首先是选项调用,然后是帖子 呼叫当调用第二个web服务(再次发布)时,没有 飞行前检查(因为第一次调用最终生成 Access Control Max Age标头以缓存飞行前检查 5分钟),但网站(outro.pt)最终返回了一个302 将浏览器重定向到登录页面

    在继续之前,下面是用于处理飞行前和允许cors调用的演示代码(我已将其放在应用程序的beginrequest事件中):

现在,这里是生成身份验证cookie的演示代码(因为这是演示代码,所以我选择使用一个简单的通用处理程序:

    public void ProcessRequest(HttpContext context) {
        context.Response.ContentType = "application/json";
        var name = "";
        using (var reader = new StreamReader(context.Request.InputStream)) {
            var std = (Student)JsonConvert.DeserializeObject(reader.ReadToEnd(),typeof(Student));
            name = std == null ? "" : std.name;
        }
        if (!String.IsNullOrEmpty(name)) {
            var cookie = FormsAuthentication.GetAuthCookie(name, false);              
            cookie.Domain = "outro.pt";
            context.Response.AppendCookie(cookie);
            context.Response.Write(JsonConvert.SerializeObject(new {valid = true}));
        }
        else {
            context.Response.Write(JsonConvert.SerializeObject(new { valid = false }));    
        }

    }
现在,在使用fiddler之后,我可以看到在调用验证处理程序时确实会返回cookie。例如,下面是一个通过调用前一个身份验证处理程序创建的cookie的示例:

设置Cookie:.ASPXAUTH=1CB7EF39DBA39BDA2FD2AAA0AAFDAB67821A286D04F1678C89CFD6036094A3F9C36D2C9E48FFE35B95C8A742F55138A8899E2CE63259F6DDC7A4D59868AF8A3F50EC037F1DAB73827B5D906A115C28FC8E4B744D661AF775955F525E236D;域=outro.pt;路径=/;HttpOnly

乍一看,我看不出这个身份验证cookie有什么问题(我认为它与正确的域相关联,应该在我访问outro.pt中维护的任何页面时发送,对吗?-甚至它被放在另一个asp.net应用程序中,比如outro.pt/demo/webservice.ashx?)

由于我在尝试访问第二个web服务时被重定向到登录页面,我认为问题在于身份验证cookie没有被发送。这是正确的:根据fiddler的说法,第二次调用的请求头中没有发送cookie。我尝试了几种方法,但我无法成功工作

阅读文档后,我认为将withCredentials字段设置为true是发送Cookie所需的唯一操作,对吗?顺便说一句,下面是使用jquery2执行的第二个web服务调用:

    var complete = url + "studentservice.ashx";
    payload = {
                    url: complete,
                    type: 'POST',
                    xhrFields: {
                        withCredentials: true
                    },
                    contentType: 'application/json',
                    crossDomain: true,
                    dataType: 'json'
                };
    $.ajax(payload)
                    .done(function (data, status, xhr) {
                        alert("success");

                    })
                    .fail(function (xhr, status, error) {
                        alert("error" + error);
                    });
那么,当需要访问的web服务需要asp.net身份验证时,是否有人设法使用cors?我缺少什么


谢谢。

我想我已经发现了问题:用于验证用户(并生成cookie)的$.ajax方法调用没有输入withCredentials字段,因此从服务器返回的cookie最终被丢弃。

谢谢。我有类似的问题。您能再解释一下吗?什么方法调用没有传递withCredentials字段>?当然。如果我没有弄错,您需要将xhrFields对象添加到执行验证和用户的身份验证。仅在后续请求(即验证后执行的请求)上使用它将不起作用。好的,谢谢。我想这就是你的意思。
    var complete = url + "studentservice.ashx";
    payload = {
                    url: complete,
                    type: 'POST',
                    xhrFields: {
                        withCredentials: true
                    },
                    contentType: 'application/json',
                    crossDomain: true,
                    dataType: 'json'
                };
    $.ajax(payload)
                    .done(function (data, status, xhr) {
                        alert("success");

                    })
                    .fail(function (xhr, status, error) {
                        alert("error" + error);
                    });