在响应中传递 cookie.重定向 in ASP.NET.



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

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

然后我发出重定向:

Response.Redirect(returnURL);

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

Request.Cookies["Username"].Value;

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

编辑:

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

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

根据 HTTP 状态管理机制

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

因此,

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

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

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

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

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

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

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

这可能是您的一个选择!

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#,此页面将很有用。

与我一起工作的解决方案是使用相对网址而不是绝对网址进行重定向:

像下面这样:

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

而不是

responce.redirect("www.yoursite.com/yourRedirectPage.aspx");

最新更新