Lui*_*reu 5 asp.net authentication cookies jquery cross-domain
我正在尝试在托管多个 WCF 服务的现有 asp.net 网站上启用 CORS。不幸的是,我很难让它发挥作用。乍一看,我被重定向到登录页面(该页面不存在),因此自定义身份验证服务生成的身份验证 cookie 可能有问题。
在继续之前,先简单描述一下我当前的情况:
身份验证按预期工作:首先有一个 OPTIONS 调用,然后是一个 POST 调用;当调用第二个 Web 服务(再次 POST)时,没有预检检查(因为第一个调用最终生成 Access-Control-Max-Age 标头,以便缓存预检检查 5 分钟),但网站(outro .pt)最终返回 302,将浏览器重定向到登录页面。
在继续之前,这里是用于处理预检和允许 cors 调用的演示代码(我已将其放置在应用程序的 beginrequest 事件中):
private void Application_BeginRequest(object sender, EventArgs e) {
var ctx = HttpContext.Current;
//allow credentials: always
ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
//add allow origin header
if (ctx.Request.Headers["Origin"] != null) {
ctx.Response.AddHeader("Access-Control-Allow-Origin", ctx.Request.Headers["Origin"]);
}
if (ctx.Request.Headers["Access-Control-Request-Headers"] != null) {
ctx.Response.AddHeader("Access-Control-Allow-Headers", ctx.Request.Headers["Access-Control-Request-Headers"]);
}
if (ctx.Request.HttpMethod.ToUpper() == "OPTIONS" ) {
ctx.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
//keep preflight info for 5 mins
ctx.Response.AddHeader("Access-Control-Max-Age", (5 * 60).ToString());
ctx.Response.End();
return;
}
}
Run Code Online (Sandbox Code Playgroud)现在,这是用于生成身份验证 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 }));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用 fiddler 后,我可以看到调用验证处理程序时确实返回了 cookie。例如,下面是通过调用前一身份验证处理程序创建的一个 cookie 的示例:
设置Cookie: .ASPXAUTH=1CB7EF39DBA39BDA2FD2AA0A0AAFDAB67821A286D04F1678C89CFD6036094A3F9C36D2C9E48FFE35B95C8A742F553138A8899E2CE63259F6DDC7A4D59868AF8 A3F50EC037F1DAB73827B5D906A115C28FC8E4B744D661AF77592955F525E236D;域=outro.pt;路径=/;仅HTTP
乍一看,我看不出这个身份验证 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);
});
Run Code Online (Sandbox Code Playgroud)
那么,当需要访问的Web服务需要asp.net身份验证时,有人设法使用cors吗?我缺少什么?
谢谢。
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |