Как удалить файлы cookie на веб-сайте ASP.NET


87

На моем веб-сайте, когда пользователь нажимает кнопку «Выход», страница Logout.aspx загружается с кодом Session.Clear().

В ASP.NET/C# удаляются ли все файлы cookie? Или нужно добавить какой-либо другой код для удаления всех файлов cookie с моего веб-сайта?

Ответы:


149

Попробуйте что-нибудь подобное:

if (Request.Cookies["userId"] != null)
{
    Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);   
}

Но также имеет смысл использовать

Session.Abandon();

к тому же во многих сценариях.


15
Session.Abandonочистит cookie сеанса ASP.NET, но не файлы cookie, которые вы установили вручную, например userID здесь. И Cookies["whatever"]никогда не бывает нулевым; фреймворк создаст файл cookie, если вы запросите несуществующий.
Andomar 09

11
@Andomar фактически Cookies["whatever"]возвращает null, если cookie не существует! Я знаю, что это старый комментарий, но я не хочу, чтобы другие читатели были введены в заблуждение этим комментарием.
Нуно Агапито

6
Также очень важно, что ExpiresНЕ установлено значение, так DateTime.MinValueкак это фактически приведет к истечению срока действия cookie для файла cookie, что означает, что он ждет, пока браузер / вкладка (зависит от браузера), прежде чем удалить cookie.
Нашенас

7
@NunoAgapito Очень старый, но для других пользователей Cookies ["что угодно"] возвращает null, если вы читаете из "Request", и возвращаете пустой куки, если вы читаете из "Response".
Athiwat Chunlakhan

но это удаляет только содержимое файла cookie, файл cookie по-прежнему остается в браузере, по крайней мере, для меня
Beingnin

50

Нет, файлы cookie можно очистить, только установив дату истечения срока действия для каждого из них.

if (Request.Cookies["UserSettings"] != null)
{
    HttpCookie myCookie = new HttpCookie("UserSettings");
    myCookie.Expires = DateTime.Now.AddDays(-1d);
    Response.Cookies.Add(myCookie);
}

На момент Session.Clear():

  • Все пары "ключ-значение" из Sessionколлекции удаляются. Session_Endсобытие не произошло.

Если вы используете этот метод во время выхода из системы, вы также должны использовать этот Session.Abandonметод для Session_Endсобытия:

  • Cookie с идентификатором сеанса (если ваше приложение использует файлы cookie для хранилища идентификаторов сеанса, что по умолчанию) удаляется

Правильно о сроке годности, но я считаю, что ifлиния на самом деле не работает. Когда вы запрашиваете файл cookie, Cookies["whatever"]фреймворк создает файл cookie, если он не существует.
Andomar 09

@Andomar Этот код я получил от MSDN. Я не думаю, что он создаст cookie, если мы вызовем Requestобъект.
VMAtm 09

2
Ага, похоже, он создает только cookie для Responseобъекта. Интересно :)
Andomar 09

3
Этот код можно оптимизировать всего одной строкой Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(-1). Здесь сервер запросит у браузера удаление cookie. Браузер удалит его, если он существует.
шашват 01

2
Да, мне нужна была часть Response.Cookies.Add (myCookie) - без нее она не работает всегда / правильно. Спасибо.
Кристофер Д. Эмерсон

28

Вот что я использую:

    private void ExpireAllCookies()
    {
        if (HttpContext.Current != null)
        {
            int cookieCount = HttpContext.Current.Request.Cookies.Count;
            for (var i = 0; i < cookieCount; i++)
            {
                var cookie = HttpContext.Current.Request.Cookies[i];
                if (cookie != null)
                {
                    var expiredCookie = new HttpCookie(cookie.Name) {
                        Expires = DateTime.Now.AddDays(-1),
                        Domain = cookie.Domain
                    };
                    HttpContext.Current.Response.Cookies.Add(expiredCookie); // overwrite it
                }
            }

            // clear cookies server side
            HttpContext.Current.Request.Cookies.Clear();
        }
    }

Спасибо! Также избавился от моей проблемы, что файл cookie не обновлял серверную часть
Tom el

11

К сожалению, для меня установка «Истекает» не всегда работала. На файл cookie это не повлияло.

Этот код работал у меня:

HttpContext.Current.Session.Abandon();
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

где "ASP.NET_SessionId"имя файла cookie. На самом деле это не удаляет файл cookie, но заменяет его пустым файлом cookie, который был для меня достаточно близок.


5

Я просто хочу указать, что файл cookie идентификатора сеанса не удаляется при использовании Session.Abandon, как говорили другие.

При выходе из сеанса cookie идентификатора сеанса не удаляется из браузера пользователя. Следовательно, как только сеанс был прерван, любые новые запросы к тому же приложению будут использовать тот же идентификатор сеанса, но будут иметь новый экземпляр состояния сеанса. В то же время, если пользователь откроет другое приложение в том же домене DNS, пользователь не потеряет состояние своего сеанса после вызова метода Abandon из одного приложения.

Иногда вы можете не захотеть повторно использовать идентификатор сеанса. Если вы это сделаете и понимаете последствия отказа от повторного использования идентификатора сеанса, используйте следующий пример кода, чтобы прервать сеанс и очистить файл cookie идентификатора сеанса:

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

Этот пример кода очищает состояние сеанса с сервера и устанавливает для cookie состояния сеанса значение null. Нулевое значение эффективно удаляет cookie из браузера.

http://support.microsoft.com/kb/899918


5

Сейчас 2018 год, поэтому в ASP.NET Core есть простая встроенная функция. Чтобы удалить cookie, попробуйте этот код:

if(Request.Cookies["aa"] != null)
{
    Response.Cookies.Delete("aa");
}
return View();

4

Никогда не следует хранить пароль в виде файлов cookie. Чтобы удалить файл cookie, вам просто нужно изменить его и истечь. Вы не можете действительно удалить его, т.е. удалить его с диска пользователя.

Вот пример:

HttpCookie aCookie;
    string cookieName;
    int limit = Request.Cookies.Count;
    for (int i=0; i<limit; i++)
    {
        cookieName = Request.Cookies[i].Name;
        aCookie = new HttpCookie(cookieName);
        aCookie.Expires = DateTime.Now.AddDays(-1); // make it expire yesterday
        Response.Cookies.Add(aCookie); // overwrite it
    }

2

Принимая заголовок вопроса ОП как удаление всех файлов cookie - «Удалить файлы cookie на веб-сайте»

Где-то в сети я наткнулся на код Дэйва Домагала. Я отредактировал Dave's, чтобы разрешить использование файлов cookie Google Analytics, которые перебирали все файлы cookie, найденные на сайте, и удаляли их все. (С точки зрения разработчика - обновление нового кода на существующем сайте - приятный прием, позволяющий избежать проблем с повторным посещением сайта пользователями).

Я использую приведенный ниже код в тандеме с чтением файлов cookie сначала, сохраняя все необходимые данные, а затем сбрасываю файлы cookie после очистки всего с помощью приведенного ниже цикла.

Код:

int limit = Request.Cookies.Count; //Get the number of cookies and 
                                   //use that as the limit.
HttpCookie aCookie;   //Instantiate a cookie placeholder
string cookieName;   

//Loop through the cookies
for(int i = 0; i < limit; i++)
{
 cookieName = Request.Cookies[i].Name;    //get the name of the current cookie
 aCookie = new HttpCookie(cookieName);    //create a new cookie with the same
                                          // name as the one you're deleting
 aCookie.Value = "";    //set a blank value to the cookie 
 aCookie.Expires = DateTime.Now.AddDays(-1);    //Setting the expiration date
                                                //in the past deletes the cookie

 Response.Cookies.Add(aCookie);    //Set the cookie to delete it.
}

Дополнение: если вы используете Google Analytics

Вышеупомянутый цикл / удаление удалит ВСЕ файлы cookie для сайта, поэтому, если вы используете Google Analytics - вероятно, было бы полезно сохранить файл cookie __utmz, поскольку он отслеживает, откуда пришел посетитель, какая поисковая система использовалась, что была нажата ссылка, какое ключевое слово было использовано и где они находились в мире, когда ваш сайт был открыт.

Итак, чтобы сохранить его, оберните простой оператор if, когда имя файла cookie известно:

... 
aCookie = new HttpCookie(cookieName);    
if (aCookie.Name != "__utmz")
{
    aCookie.Value = "";    //set a blank value to the cookie 
    aCookie.Expires = DateTime.Now.AddDays(-1);   

    HttpContext.Current.Response.Cookies.Add(aCookie);    
}

1

Хотя это старый поток, я подумал, если кто-то все еще ищет решение в будущем.

HttpCookie mycookie = new HttpCookie("aa");
mycookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(mycookie1);

Это то, что помогло мне.



0

Вы должны установить дату истечения срока, чтобы удалить куки

Request.Cookies[yourCookie]?.Expires.Equals(DateTime.Now.AddYears(-1));

Это не вызовет исключения, если файл cookie не существует.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.