Подтвердить что ты не робот

OWIN SignOut не удаляет файлы cookie

Я использую промежуточное ПО OWIN на внешнем сервере аутентификации, чтобы мои приложения аутентифицировались с использованием потока предоставления кода авторизации OAuth.

Я могу перенаправить на сервер проверки подлинности, пройти аутентификацию против внешнего провайдера (Google) и перенаправить обратно на свое клиентское приложение с зарегистрированным пользователем и Cookie приложения, но все же, когда я пытаюсь выписать cookie, остается после того, как я вызовите метод AuthenticationManager.SignOut.

Мои параметры файла cookie в Startup.Auth.cs:

var cookieOptions = new CookieAuthenticationOptions
                    {
                        Provider = cookieProvider,
                        AuthenticationType = "Application",
                        AuthenticationMode = AuthenticationMode.Passive,
                        LoginPath = new PathString("/Account/Index"),
                        LogoutPath = new PathString("/Account/Logout"),
                        SlidingExpiration = true,
                        ExpireTimeSpan = TimeSpan.FromMinutes(30),
                    };
app.UseCookieAuthentication(cookieOptions);
app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

Мой метод входа:

var loginInfo = await AuthManager.GetExternalLoginInfoAsync();
SignInManager.ExternalSignInAsync(loginInfo, true);
var identity = AuthManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result.Identity;

if (identity != null)
{
    AuthManager.SignIn(
                  new AuthenticationProperties {IsPersistent = true},
                  new ClaimsIdentity(identity.Claims, "Application", identity.NameClaimType, identity.RoleClaimType));

        var ticket = AuthManager.AuthenticateAsync("Application").Result;
        var identity = ticket != null ? ticket.Identity : null;
        if (identity == null)
        {
            AuthManager.Challenge("Application");
            return new HttpUnauthorizedResult();
        }

        identity = new ClaimsIdentity(identity.Claims, "Bearer", identity.NameClaimType, identity.RoleClaimType);
        AuthManager.SignIn(identity);
}

return Redirect(Request.QueryString["ReturnUrl"]);

Способ выхода:

var authTypeNames = new List<string>();
authTypeNames.Add("Google");
authTypeNames.Add("Application");
authTypeNames.Add("Bearer");
authTypeNames.Add(DefaultAuthenticationTypes.ExternalCookie);

Request.GetOwinContext().Authentication.SignOut(authTypeNames.ToArray());

Я рассмотрел другие вопросы: Аутентификация OWIN, истечение текущего токена и удаление файла cookie а также OWIN - Authentication.SignOut() не удаляет файлы cookie

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

Как я могу удалить Cookie приложения при выходе из системы?

4b9b3361

Ответ 1

От другого ответа StackOverFlow, который работал у меня: OWIN - Authentication.SignOut(), похоже, не удаляет файл cookie

Используйте только одно из них:

Request.GetOwinContext().Authentication.SignOut();
Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

https://dzone.com/articles/catching-systemwebowin-cookie

Я бы предположил, что второй будет работать для вас, но похоже, что вы делаете. Можете ли вы проверить это самостоятельно? Прокомментируйте свой массив и подтвердите, что это работает или нет.

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

Ответ 2

Для того, чтобы метод SignOut помещал флажок аутентификации (cookie) для удаления из клиента, параметр AuthenticationType, который вы передаете методу SignOut и значение в cookie, должен точно соответствовать. Если вы хотите удалить более одного аутентификационного билета от клиента, вам придется сопоставить ВСЕ эти теги AuthenticationTypes и передать их как строку [] методу SignOut.

Аутентификационный тип аутентификационного билета обычно имеет префикс имени веб-контейнера-хоста (например, ".AspNet." ), за которым следует то, что вы загрузили с помощью настроек OWIN CookieAuthentication.

Похоже, вы установили строковое значение AuthenticationType в "Приложение" в Startup.Auth.cs. Попробуйте просто позвонить:

Request.GetOwinContext().Authentication.SignOut("Application");

Если это не работает для вас, я бы отлаживал ваше приложение и просматривал конкретный AuthenticationType на идентификаторе для каждого типа аутентифицированного пользователя, которое позволяет ваше приложение, обратите внимание на значение AuthenticationType для каждого из них и попробуйте включить их все в строке [] в вашем вызове SignOut.

Ответ 3

 AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
 FormsAuthentication.SignOut();
 Session.Abandon();

Ответ 4

Если у вас есть главная страница, добавьте тег ниже. Может быть, это было бы полезно.

<meta http-equiv="Cache-control" content="no-cache" />