У мене є дивна проблема із використанням автентифікації файлів cookie Owin.
Коли я запускаю IIS-сервер, автентичність працює ідеально на IE / Firefox та Chrome.
Я почав робити тестування з використанням автентифікації та входу на різних платформах, і зіткнувся з дивною помилкою. Спорадично, Owin Framework / IIS просто не надсилає файли 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 + моє печиво для автентифікації. 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 відрізняється. Що я бачу, це те, що мої сеанси Овіна залишаються живими довше, ніж мої сеанси ASP через якийсь механізм. Тому при вході в систему: 1.) У мене є авторизований сеанс на основі cookied 2.) Я встановив кілька змінних сеансів
Мої змінні сеансу (2) "відмирають" перед змінною сеансу cookie Owin змушують повторно входити в систему, що викликає несподівану поведінку протягом усієї моєї програми. (Користувач увійшов, але насправді не ввійшов)
Оновлення 3B
Після деякого копання я побачив деякі коментарі на сторінці, де сказано, що "форми" аутентифікації та час очікування сеансу повинні збігатися. Я думаю, що обидва вони синхронізовані, але з будь-якої причини вони не синхронізовані.
Короткий зміст обхідних питань
1) Завжди створюйте сеанс спочатку перед аутентифікацією. В основному створюйте сеанс під час запуску програмиSession["Workaround"] = 0;
2) [Експериментальний], якщо ви зберігаєте файли cookie, переконайтесь, що час / довжина OWIN більше, ніж ваш сеанс тайм-аут у вашому web.config (для тестування)