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 приложения при выходе из системы?
Ответы
Ответ 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" />