我应该设置哪些Cookie /标题?

时间:2019-01-23 15:19:37

标签: c# cookies header http-headers

我应该从外部站点获取受保护的页面,如果直接调用它,则会收到错误消息:

  

错误请求

邮递员:

enter image description here

但是,如果我通过邮递员使用有效凭据调用登录页面:

enter image description here

,然后从我得到受保护页面的同一位邮递员那里调用相同的资源页面!

enter image description here

我必须在网站上获得同一页面。我尝试通过以下方式实现它:

            var loginXml = "<Request><MsgType>Authenticate</MsgType><SubMsgType>Login</SubMsgType><UserID>my_login</UserID><passwordNotEncrypted>my_password</passwordNotEncrypted></Request>";
            $.ajax(
                {
                    url: 'https://address/browserservices.aspx/login',
                    type: 'POST',
                    contentType: 'text/xml',
                    datatype: 'text',
                    //xhrFields: {
                    //    withCredentials: true
                    //},
                    //crossDomain: true,
                    data: loginXml,
                    success: function (output, status, xhr) {
                        alert(xhr.getResponseHeader("Set-Cookie"));
                        $.ajax({
                            url: "https://address/RemoteSupport.aspx?id=GUID&pltFrmType=Android&agentversion=13.46",
                            type: 'GET',
                            xhrFields: { withCredentials: true },
                            //crossDomain: true,
                            success: function (x) { },
                            error: function (xhr, textStatus) { alert(xhr.status); }
                        });
                    },
                })

但是我再次得到Bad Request。 我应该传递到页面的哪些标题/ cookie以打开受保护的页面,就像在邮递员中一样?

添加了28/01/19 成功登录请求后的邮递员“ Cookie”选项卡(失败登录请求具有相同的内容):

enter image description here

和“标题”标签:

enter image description here

如我所见,所有access-control-allow标头都可用。我应该通过ajax通过什么?

1 个答案:

答案 0 :(得分:1)

根据您提供的信息,有两种可能的情况。

首先,由外部站点设置的cookie是HttpOnly。单击 Cookies 标签,这很容易签入Postman。

第二个选项稍微复杂一点,但是外部服务器必须正确设置访问控制标头。再次有一个 Headers 标签来查看这些内容。有关此问题中跨域Ajax和标头的更多信息:Why is jquery's .ajax() method not sending my session cookie?

最后值得注意的是,您的浏览器将自动添加一个标头,以表明这是一个ajax请求。您可以尝试在Postman中添加X-Requested-With: XMLHttpRequest标头,并查看它与示例的不同之处。可以将外部服务器配置为对Ajax请求的响应与对浏览器或服务器服务器api请求的响应不同。

更新 您的邮递员更新显示这两种情况都是正确的。不幸的是,这意味着您无法使用JavaScript达到所需的结果。 HttpOnly = true表示浏览器将永远不允许您页面上的脚本访问cookie。

这时,最好的选择可能是在自己的站点上编写一个小的代理方法,该方法将请求服务器连接到服务器,然后将结果返回到JavaScript代码。尽管您需要对数据发出2个请求而不是1个请求,但这应该绕过上述所有问题。

看看此答案的一些代码

Struggling trying to get cookie out of response with HttpClient in .net 4.5