12

我在将 ASP.NET 中的 cookie 传递到新 URL 时遇到问题。我将cookie添加到响应中,如下所示:

Response.Cookies.Add(new HttpCookie("Username", Username.Text));

然后我发出重定向:

Response.Redirect(returnURL);

在我被重定向到的新页面上,cookie 集合是空的。我尝试像这样检索cookie:

Request.Cookies["Username"].Value;

谁能想到为什么没有通过cookies?

编辑:

我忘记添加的更多信息 - 在同一浏览器会话中的第二次尝试中,cookie 正确地通过重定向传递。

编辑#2:我发现如果我在重定向 URL 中使用“localhost”而不是实际域名,那么 cookie 会在第一次登录时正确传递。因此,只有当重定向 URL 是实际域名时,它才不起作用。奇怪的。

4

6 回答 6

5

根据HTTP状态管理机制

源服务器可以发送带有任何
响应的 Set-Cookie 响应标头。用户代理可以忽略包含在
具有 100 级状态代码的响应中的 Set-Cookie
头,但必须处理包含在其他响应中的 Set-Cookie 头(包括具有 400
和 500 级状态代码的响应)。源服务器可以
在单个响应中包含多个 Set-Cookie 标头字段。Cookie 或 Set-Cookie 标头字段的存在
并不妨碍 HTTP 缓存
存储和重用响应。

因此 REDIRECTs (3xx) 在“其他”响应中,因此它们应该由浏览器处理,然后浏览器可能会出于各种原因丢弃它们。浏览器拒绝 cookie 的原因之一是指定了 cookie 的域属性并且没有足够的点(如“localhost”),或者当 cookie 的路径属性与 URL 中的实际路径大小写不匹配时(cookie 的路径区分大小写)。

于 2013-11-15T01:29:35.450 回答
5

浏览器仅将 cookie 发送回与设置 cookie 的页面位于同一域中的页面。

因此,如果您转到页面http://localhost/login.aspx,然后服务器继续设置 cookie 并重定向到(例如)http://mymachinename/default.aspx,则在请求第二个 url 时,cookie 不会从浏览器发送到服务器,因为它不在同一个域中。

要取回 cookie,您要么必须重定向到,要么必须http://localhost/default.aspx从最初转到http://mymachinename/login.aspx.

于 2012-08-14T14:08:50.300 回答
4

我在 .NET Core 2.1 WebApp 中遇到了同样的问题。搜索了一段时间后,我发现我可以使用以下命令来强制 cookie 在重定向响应时不丢失。

HttpContext.Response.Cookies.Append("cookie-name", "cookie-value", new CookieOptions { IsEssential = true });

文档提到此属性“指示此 cookie 是否对于应用程序正常运行至关重要。如果为 true,则可能会绕过同意策略检查。默认值为 false。”

这可能是您的选择!

于 2019-01-11T15:55:47.900 回答
2
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Request.QueryString["AcceptsCookies"] == null)
        {
            Response.Cookies["TestCookie"].Value = "ok";
            Response.Cookies["TestCookie"].Expires =
                DateTime.Now.AddMinutes(1);
            Response.Redirect("TestForCookies.aspx?redirect=" +
                Server.UrlEncode(Request.Url.ToString()));
        }
        else
        {
            Label1.Text = "Accept cookies = " +
                Server.UrlEncode(
                Request.QueryString["AcceptsCookies"]);
        }
    }
}

此链接将帮助您了解在 C# 中读取和编写 cookie。

此外,如果您更熟悉 VB 而不是 C# ,此页面将很有用。

于 2012-08-09T14:21:12.170 回答
0

与我合作的解决方案是使用相对 url 而不是绝对 url 进行重定向:

像下面这样:

Response.redirect("~/yourRedirectPage.aspx");

代替

responce.redirect("www.yoursite.com/yourRedirectPage.aspx");
于 2021-01-31T07:50:47.320 回答
0

通常我让我的服务器生成一个我通过 ajax 检索的 Base64 字符串。当准备好的对象可用时,然后我从客户端上的 base 64 字符串制作“附件”。这样,我可以跨浏览器一致地响应下载完成。

于 2018-02-07T17:16:36.777 回答