1

所以我有一个带有自定义表单身份验证的 ASP.NET Web 表单应用程序。我基本上只是创建一个包含加密用户名和密码的 cookie,并使用该 cookie 保持会话活动。当用户注销时,我将同名的过期 cookie (cookie.Expires = Now) 添加到响应中。当我在任何实际页面上时,例如http://www.mydomain.com/defaulthttp://www.mydomain.com/aboutus,我都可以退出登录。但是,如果用户碰巧在http://www.mydomain.com上,则注销失败。

实际页面包含域 (www.mydomain.com) 和过期日期时的 cookie。但是在 www.mydomain.com 上,该 cookie 不包含域或到期日期。

从 Fiddler 观看:从根域注销 ( http://www.mydomain.com ) Fiddler 说:

此响应未设置任何 cookie。

即使提琴手检查员按名称显示我的 cookie - 请求发送了 351 个字节的 Cookie 数据:

ASP.NET_SessionId=tdohhekwzigkpuvqbphkzyxv; DEABE_ROBTFVAN=YYpYXpVjdkNEQwcPIhLrDkN4acbigcb9Ve9QusdfsdfdMCAYka981sdfsdfsdfXxl8eBXg==;

从任何实际页面注销 ( http://www.mydomain/aboutus ) 响应发送了 62 个字节的 Cookie 数据:Set-Cookie: DEABE_ROBTFVAN=; 过期=周日,2013 年 10 月 6 日 20:14:42 GMT;路径=/__utmb=142232619.22.10.1381088759; __utmc=142232619;

单击注销时来自根域的请求如下所示: POST / HTTP/1.1 主机:www.mydomain.com 连接:keep-alive 内容长度:682 接受:text/html,application/xhtml+xml,application/xml;q =0.9,image/webp, / ;q=0.8 来源:http ://www.mydomain.com 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0。 1599.69 Safari/537.36 内容类型:应用程序/x-www-form-urlencoded 引用者:http ://www.mydomain.com/ 接受编码:gzip,deflate,sdch 接受语言:en-US,en;q=0.8 Cookie:ASP.NET_SessionId=0d2rmdy1w5wsiontcrml12yw; DEABE_ROBTFVAN=YYpYXpVjdkNEQwcPIhLrDkN4acbigasdasdasdcb9Ve9QuMCAYka981Xxl8eBXg==; __utma=142232619.1494664078.1381091188.1381091188.1381094343.2; __utmb=142232619.3.10.1381094343; __utmc=142232619; __utmz=142232619.1381094343.2.2.utmcsr=mydomain.com|utmccn=(推荐)|utmcmd=推荐|utmcct=

我从 www.mydomain.com/about 注销时的请求:POST /About HTTP/1.1 主机:www.mydomain.com 连接:keep-alive 内容长度:402 接受:text/html,application/xhtml+xml,application /xml;q=0.9,image/webp, / ;q=0.8 来源:http ://www.mydomain.com 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36 内容类型:application/x-www-form-urlencoded 引用者:http ://www.mydomain.com/About 接受编码:gzip,deflate,sdch 接受语言:en-US,en;q=0.8 Cookie:ASP.NET_SessionId=0d2rmdy1w5wsiontcrml12yw; DEABE_ROBTFVAN=YYpYXpVjdkNEQwcPIhLrDkN4acbigcb9Ve9QuMCAYka981Xxl8eBXg==; __utma=142232619.1494664078.1381091188.1381091188.1381094343.2; __utmb=142232619.5.10.1381094343; __utmc=142232619; __utmz=142232619.1381094343.2.2.utmcsr=kazork.com|utmccn=(推荐)|utmcmd=推荐|utmcct=/admin/user/UserSearch.aspx

我的代码:

 Public Sub Logout()

        GlobalFunctions.AddCookieToResponse(Nothing, Nothing, True)

        HttpContext.Current.Session("AP_CurrentUser") = Nothing
        HttpContext.Current.Session.Abandon()

    End Sub

Public Shared Sub AddCookieToResponse(userName As String, password As String, Optional expireNow As Boolean = False)

    '====================================================================
    'Create top level domain cookie
    '====================================================================
    'Domain not being used currently, wanted to eliminate .mydomain I was seeing in the cookie
    Dim domain As String = GetDomain()

    Dim cookie As New HttpCookie(GlobalFunctions.GetCookieName())

    'If GlobalFunctions.HasData(domain) Then
    '    cookie.Domain = domain
    'End If

    If GlobalFunctions.HasData(userName) And GlobalFunctions.HasData(password) Then
        cookie.Value = GlobalFunctions.Encrypt(userName & ":" & password)
    End If

    If expireNow Then
        cookie.Expires = Now
    Else
        cookie.Expires = DateTime.Now.AddDays(1)
    End If

    HttpContext.Current.Response.Cookies.Add(cookie)
    '====================================================================

End Sub

Public Shared Function GetCookieName() As String
    If GetCurrentWebsiteName() = Constants.WEBSITES.MyWebsite1 Then
        Return "DEABE_ROBTFVAN"
    Else
        Return "ABE_OPED_JDZRK"
    End If
End Function

工作时的响应流量:(有两个成功注销的响应

HTTP/1.1 302 找到 Cache-Control: private,600 Content-Type: text/html; charset=utf-8 位置:/默认服务器:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 Set-Cookie:DEABE_ROBTFVAN=; 到期=格林威治标准时间 2013 年 10 月 23 日星期三 05:57:45;路径=/ 设置 Cookie:OAUTHDEABE_ROBTFVAN=; 域=www.mydomain.com;到期=格林威治标准时间 2013 年 10 月 23 日星期三 05:57:45;路径=/ X-Powered-By:ASP.NET 日期:星期三,2013 年 10 月 23 日 05:57:45 GMT 内容长度:125

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Default">here</a>.</h2>
</body></html>

Repsonse 2 成功注销 HTTP/1.1 200 OK Cache-Control: private,600 Content-Type: text/html; charset=utf-8 内容编码:gzip 变化:接受编码服务器:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 日期:2013 年 10 月 23 日,星期三 06:23 :03 GMT 内容长度:7710

�������� I�%&/m�{J�J��t��$ؐ@������iG#)�*��eVe]f@�흼��{���{���;�N'���?\fdl ��J�ɞ!���?~|?”~��7N��O�

* FIDDLER:RawDisplay 被截断为 128 个字符。右键单击以禁用截断。*

响应流量在根域注销时不起作用:

HTTP/1.1 200 OK Cache-Control: private,600 Content-Type: text/html; charset=utf-8 内容编码:gzip 变化:接受编码服务器:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 日期:2013 年 10 月 23 日,星期三 06:12 :25 GMT 内容长度:8274

�������� I�%&/m�{J�J��t��$ؐ@������iG#)�*��eVe]f@�흼��{���{���;�N'���?\fdl ��J�ɞ!���?~|?”~��7N��O�

* FIDDLER:RawDisplay 被截断为 128 个字符。右键单击以禁用截断。*

4

3 回答 3

0

这听起来不像是饼干的问题。您发布的流量看起来很奇怪(或者我可能只是没有正确阅读)。

当您注销时,您是否POST//About?这就是它在日志的第一部分中所说的,但我通常希望它会去/Logout或类似的东西。

然后,当服务器响应时,成功版本返回 302 和Set-Cookie. 这就是删除 cookie 的部分。第二个响应只是跟随来自 302 的重定向。

当它失败时,它返回一个没有 a 的 200,Set-Cookie这让我想知道是否调用了服务器端 Logout 方法。

于 2013-10-24T14:38:40.247 回答
0

首先,尝试将过期日期设置为过去的日期

cookie.Expires = DateTime.Now.AddDays( -1 );

如果这没有帮助,请确认您在发出 cookie 时没有设置路径。

如果这仍然没有帮助,请使用 http 调试器(如 fiddler)来验证发生了什么 - 您似乎不确定 cookie 是否没有到达浏览器或浏览器不接受它,但两者之一可以是当您使用调试器查看流量时,很容易消除。

于 2013-10-05T13:16:36.460 回答
0

好像您有不同的同名 cookie。如果 cookie 的创建方式不同,就会发生这种情况。如果您没有指定路径,那么 cookie 将与页面相关。

于 2013-10-22T20:17:14.807 回答