Як видалити файли 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, встановлені вами вручну, як тут ідентифікатор користувача. І Cookies["whatever"]ніколи не має значення null; фреймворк створить файл cookie, якщо ви запитаєте неіснуючий файл cookie.
Andomar

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

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

7
@NunoAgapito Дуже старий, але для інших користувачів файли cookie ["whatever"] повертають null, якщо ви читаєте з "Request", і повертаєте порожній cookie, якщо ви читаєте з "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

@Andomar Цей код я отримав від MSDN. Я не думаю, що це створить cookie, якщо ми викликаємо Requestоб'єкт.
VMAtm

2
Ага, схоже, це лише створює файли cookie для Responseоб’єкта. Цікаво :)
Andomar

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

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 не оновлюють сторону сервера
Том ель Сафаді

11

На жаль, для мене встановлення "Expires" не завжди спрацьовувало. Файл 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 стану сеансу на нуль. Нульове значення ефективно очищає файли 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 на веб-сайті"

Я десь натрапив на код Дейва Домагали в Інтернеті. Я відредагував Дейв, щоб дозволити файли 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

Вам потрібно встановити термін дії, щоб видалити файли cookie

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

Це не призведе до винятку, якщо файл cookie не існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.