У меня есть странная проблема с использованием проверки подлинности cookie Owin.
Когда я запускаю аутентификацию сервера IIS, отлично работает на IE/Firefox и Chrome.
Я начал выполнять некоторые тесты с помощью проверки подлинности и входа в систему на разных платформах, и я придумал странную ошибку. Спорадически структура Owin/IIS просто не отправляет файлы cookie в браузер. Я буду вводить имя пользователя и пароль, который правильный код запускается, но cookie не доставляется в браузер вообще. Если я перезапущу сервер, он начнет работать, и в какой-то момент я попробую войти в систему, а 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.x.x.x) и localhost.
Обновление 2: Создайте создание ASPNET_SessionId
сначала на моей странице login_load перед аутентификацией с помощью OWIN.
1) перед тем, как я аутентифицируюсь с помощью OWIN, я делаю случайное значение Session.Content
на моей странице входа, чтобы запустить ASP.NET_SessionId
2), затем я проверяю подлинность и выполняю дальнейшие сеансы
3) Другие браузеры теперь работают
Это странно. Я могу только сделать вывод, что это имеет какое-то отношение к ASP и OWIN, думая, что они находятся в разных областях или что-то в этом роде.
Обновление 3 - странное поведение между ними.
Определено дополнительное странное поведение - время ожидания сеанса Owin и ASP отличается. Я вижу, что мои сеансы Owin остаются в живых дольше, чем мои сеансы ASP через какой-то механизм. Поэтому при входе в систему: 1.) У меня есть готовая начальная сессия 2.) Я установил несколько переменных сеанса
Мои переменные сеанса (2) "умирают" до того, как переменная сеанса cookie owin заставляет повторно войти в систему, что вызывает неожиданное поведение во всем моем приложении. (Лицо зарегистрировалось, но на самом деле оно не вошло в систему)
Обновить 3B
После некоторого копания я увидел несколько комментариев на странице, в которых говорится, что тайм-аут аутентификации "форм" должен совпадать. Я обычно думаю, что они синхронизированы, но по какой-то причине они не синхронизированы.
Резюме обходных решений
1) Перед началом проверки всегда создавайте сеанс. В основном создайте сеанс при запуске приложения Session["Workaround"] = 0;
2) [Экспериментально], если вы сохраняете файлы cookie, убедитесь, что ваш тайм-аут/длина OWIN больше, чем ваш sessionTimeout в вашем web.config(при тестировании)