У меня странная проблема с использованием аутентификации файла cookie Оуэна.
Когда я запускаю свой сервер IIS, аутентификация отлично работает в IE / Firefox и Chrome.
Я начал проводить тестирование с аутентификацией и входом в систему на разных платформах, и у меня возникла странная ошибка. Спорадически среда Owin / IIS просто не отправляет куки в браузеры. Я введу имя пользователя и пароль, которые верны, код запускается, но в браузер не доставляются файлы cookie. Если я перезагружаю сервер, он начинает работать, и в какой-то момент я попытаюсь войти в систему, и снова куки перестают доставляться. Переход по коду ничего не делает и не выдает ошибок.
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
И в моей процедуре входа в систему у меня есть следующий код:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
Обновление 1. Кажется, что одной из причин проблемы является то, что когда я добавляю элементы в сеанс, начинаются проблемы. Session.Content["ABC"]= 123
Кажется, добавление чего-то простого создает проблему.
Что я могу разглядеть, так это: 1) (Chrome) При входе в систему я получаю ASP.NET_SessionId + мой файл cookie аутентификации. 2) Я захожу на страницу, которая устанавливает session.contents ... 3) Откройте новый браузер (Firefox) и попробуйте войти в систему, и он не получит ASP.NET_SessionId и не получит Cookie проверки подлинности 4) Пока первый браузер имеет ASP.NET_SessionId, он продолжает работать. В тот момент, когда я удаляю этот файл cookie, возникает та же проблема, что и во всех других браузерах, с которыми я работаю по IP-адресу (10.xxx) и localhost.
Обновление 2:ASPNET_SessionId
принудительное создание первого на моей странице login_load перед аутентификацией с помощью OWIN.
1) перед тем, как пройти аутентификацию с помощью OWIN, я делаю случайное Session.Content
значение на странице входа в систему, чтобы запустить ASP.NET_SessionId. 2) Затем я аутентифицируюсь и выполняю дальнейшие сеансы. 3) Кажется, теперь работают другие браузеры.
Это странно. Я могу только заключить, что это как-то связано с ASP и OWIN, думая, что они находятся в разных доменах или что-то в этом роде.
Обновление 3 - Странное поведение между ними.
Выявлено дополнительное странное поведение - Таймаут Оуэна и ASP-сессии различны. Что я вижу, так это то, что мои сеансы Owin остаются живыми дольше, чем мои сеансы ASP через некоторый механизм. Поэтому при входе в систему: 1.) У меня есть сеанс аутентификации, основанный на кулинарии 2.) Я установил несколько переменных сеанса
Мои переменные сеанса (2) «умирают» до того, как переменная сеанса cookie-файла owin вызывает повторный вход в систему, что вызывает неожиданное поведение во всем приложении. (Человек вошел в систему, но на самом деле не вошел в систему)
Обновление 3B
После некоторых копаний я увидел на странице несколько комментариев, в которых говорится, что время аутентификации «форм» и время сеанса должны совпадать. Я думаю, что обычно они синхронизированы, но по какой-то причине они не синхронизированы.
Резюме обходных путей
1) Всегда создавайте сеанс перед аутентификацией. В основном создать сеанс при запуске приложенияSession["Workaround"] = 0;
2) [Экспериментально], если вы сохраняете куки, убедитесь, что ваш тайм-аут / длина OWIN больше, чем ваш sessionTimeout в вашем web.config (в тестировании)