【发布时间】:2021-10-27 17:50:21
【问题描述】:
出于测试目的,设置了两个 Web 应用程序,一个“客户端”应用程序 (localhost) 和一个服务器应用程序(Azure Web 应用程序)。客户端向服务器发送 AJAX 请求并接收 cookie 作为响应。然后它再次对服务器进行 AJAX 调用,但请求中没有 cookie,它丢失了。
这是服务器配置(CORS 设置;https://localhost:44316 是我的“客户端”URL):
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => {
o.AddPolicy("policy1", builder =>
builder.WithOrigins("https://localhost:44316")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("policy1");
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
这是第一个控制器,返回 cookie:
[Route("api/[controller]")]
[ApiController]
public class AController : ControllerBase
{
[HttpPost]
public IActionResult Post()
{
var cookieOptions = new CookieOptions
{
HttpOnly = true,
Expires = DateTime.Now.AddMinutes(10),
SameSite = SameSiteMode.None
};
Response.Cookies.Append("mykey", "myvalue", cookieOptions);
return Ok();
}
}
这是第二个控制器,它应该接收 cookie(但它没有):
[Route("api/[controller]")]
[ApiController]
public class BController : ControllerBase
{
[HttpPost]
public IActionResult Post()
{
var x = Request.Cookies;
return Ok(JsonConvert.SerializeObject(x));
}
}
这是来自“客户端”的调用脚本(分别是第一次和第二次调用):
function Go()
{
$.ajax({
url: 'https://somewebsite.azurewebsites.net/api/a',
type: 'post',
xhrFields: {
withCredentials: true
},
success: function (data, textStatus, jQxhr)
{
console.log(data);
},
error: function (jqXhr, textStatus, errorThrown)
{
console.log(errorThrown);
}
});
}
function Go2()
{
$.ajax({
url: 'https://somewebsite.azurewebsites.net/api/b',
type: 'post',
xhrFields: {
withCredentials: true
},
success: function (data, textStatus, jQxhr)
{
console.log(data);
},
error: function (jqXhr, textStatus, errorThrown)
{
console.log(errorThrown);
}
});
}
有人知道这可能是什么问题吗?
【问题讨论】:
-
您希望将 cookie 发送给第 3 方,或者您向同一个域/子域发出请求?
-
"client" web 是一个站点,server web 是另一个站点,不涉及第 3 方。
-
如果我的回复有帮助,请采纳为答案(点击回复旁边的标记选项将其从灰色切换为填写。),请参阅meta.stackexchange.com/questions/5234/…
-
我的理解是,调用
Go函数的响应标头应该包含 cookie,因此您不需要任何 MVC 结构来从运行在 Azure 上的应用程序接收它们? -
BController 在从 Go2 函数调用时必须接收这些 cookie,但情况并非总是如此(我正在使用最新的 Chrome、Firefox、Edge 和 Opera 进行测试)。我在这些浏览器中尝试了各种 cookie 设置,但没有帮助。无论如何,我正在努力理解和解决问题,而不是随便得到一些“似乎有效”的东西。
标签: javascript c# ajax asp.net-core cookies