无法从根域注销

时间:2013-10-05 07:11:14

标签: asp.net cookies forms-authentication

所以我有一个带有自定义表单身份验证的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。

即使小提琴手检查员按名称显示我的饼干 - 请求发送了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 连接:保持活力 内容长度:682 接受:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp, / ; q = 0.8 来源:http://www.mydomain.com User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 30.0.1599.69 Safari / 537.36 内容类型:application / x-www-form-urlencoded 推荐人:http://www.mydomain.com/ Accept-Encoding:gzip,deflate,sdch Accept-Language: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 /关于HTTP / 1.1 主持人:www.mydomain.com 连接:保持活力 内容长度:402 接受:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp, / ; q = 0.8 来源:http://www.mydomain.com User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 30.0.1599.69 Safari / 537.36 内容类型:application / x-www-form-urlencoded 推荐人:http://www.mydomain.com/About Accept-Encoding:gzip,deflate,sdch Accept-Language: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 = /管理/用户/ 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 缓存控制:私有,600 内容类型:text / html;字符集= utf-8的 位置:/默认 服务器:Microsoft-IIS / 7.5 X-AspNet-Version:4.0.30319 Set-Cookie:DEABE_ROBTFVAN =; expires = Wed,23-Oct-2013 05:57:45 GMT;路径= / Set-Cookie:OAUTHDEABE_ROBTFVAN =;域= www.mydomain.com; expires = Wed,23-Oct-2013 05:57:45 GMT;路径= / 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>

成功退出后退回2 HTTP / 1.1 200好的 缓存控制:私有,600 内容类型:text / html;字符集= 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'\fdlJɞ〜|?!?“〜7NO

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

响应流量根域中的注销不起作用时

HTTP / 1.1 200好的 缓存控制:私有,600 内容类型:text / html;字符集= 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'\fdlJɞ〜|?!?“〜7NO

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

3 个答案:

答案 0 :(得分:0)

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

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

如果这样做无效,请确认在发出Cookie时未设置路径。

如果仍然没有帮助,请使用http调试器(如fiddler)来验证发生了什么 - 您似乎不确定cookie是否无法访问浏览器或浏览器是否接受它但是其中一个当您通过调试器查看流量时,可以轻松消除两个。

答案 1 :(得分:0)

好像你有不同的同名cookie。如果cookie不是以相同的方式创建,则会发生这种情况。如果您没有指定路径,则cookie将相对于页面。

答案 2 :(得分:0)

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

当您退出时,您是POST还是//About?这就是它在日志的第一部分所说的内容,但我通常希望它转到/Logout或类似的东西。

然后,当服务器响应时,成功版本将返回带有Set-Cookie的302。这就是删除cookie的一点。第二个响应就是跟随302的重定向。

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