Saya memiliki masalah aneh dengan menggunakan otentikasi cookie Owin.
Ketika saya memulai otentikasi server IIS saya berfungsi dengan baik di IE / Firefox dan Chrome.
Saya mulai melakukan beberapa pengujian dengan Otentikasi dan masuk pada platform yang berbeda dan saya menemukan kesalahan yang aneh. Kerangka kerja Owin / IIS secara sporadis tidak mengirim cookie apa pun ke browser. Saya akan mengetikkan nama pengguna dan kata sandi yang benar ketika kode berjalan tetapi tidak ada cookie yang dikirim ke browser sama sekali. Jika saya me-restart server itu mulai berfungsi maka di beberapa titik saya akan mencoba masuk dan lagi cookie berhenti terkirim. Melangkah kode tidak melakukan apa-apa dan tidak ada kesalahan.
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);
}
}
}
});
Dan dalam prosedur login saya, saya memiliki kode berikut:
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);
Pembaruan 1: Tampaknya salah satu penyebab masalah adalah ketika saya menambahkan item ke sesi masalah dimulai. Menambahkan sesuatu yang sederhana seperti Session.Content["ABC"]= 123
tampaknya menciptakan masalah.
Yang dapat saya lakukan adalah sebagai berikut: 1) (Chrome) Ketika saya masuk saya mendapatkan ASP.NET_SessionId + cookie otentikasi saya. 2) Saya pergi ke halaman yang menetapkan session.contents ... 3) Buka browser baru (Firefox) dan coba masuk dan tidak menerima ASP.NET_SessionId juga tidak mendapatkan Cookie Otentikasi 4) Sementara browser pertama memiliki ASP.NET_SessionId terus berfungsi. Begitu saya menghapus cookie ini, ia memiliki masalah yang sama dengan semua browser lain yang sedang saya kerjakan pada alamat ip (10.xxx) dan localhost.
Pembaruan 2: Memaksa pembuatan ASPNET_SessionId
pertama pada halaman login_load saya sebelum otentikasi dengan OWIN.
1) sebelum saya mengautentikasi dengan OWIN, saya membuat Session.Content
nilai acak pada halaman login saya untuk memulai ASP.NET_SessionId 2) kemudian saya mengautentikasi dan membuat sesi lebih lanjut 3) Browser lain tampaknya sekarang berfungsi
Ini aneh. Saya hanya dapat menyimpulkan bahwa ini ada hubungannya dengan ASP dan OWIN berpikir mereka berada di domain yang berbeda atau sesuatu seperti itu.
Perbarui 3 - Perilaku aneh antara keduanya.
Identifikasi perilaku aneh tambahan - Batas waktu sesi Owin dan ASP berbeda. Apa yang saya lihat adalah bahwa sesi Owin saya tetap hidup lebih lama dari sesi ASP saya melalui beberapa mekanisme. Jadi ketika masuk: 1.) Saya memiliki sesi auth berbasis cookie 2.) Saya menetapkan beberapa variabel sesi
Variabel sesi saya (2) "mati" sebelum variabel sesi cookie owin memaksa login ulang, yang menyebabkan perilaku tak terduga di seluruh aplikasi saya. (Orang masuk tetapi tidak benar-benar masuk)
Perbarui 3B
Setelah beberapa penggalian, saya melihat beberapa komentar pada halaman yang mengatakan batas waktu otentikasi "formulir" dan batas waktu sesi harus cocok. Saya pikir biasanya keduanya sinkron tetapi karena alasan apa pun keduanya tidak sinkron.
Ringkasan Penanganan Masalah
1) Selalu buat Sesi terlebih dahulu sebelum otentikasi. Pada dasarnya buat sesi ketika Anda memulai aplikasiSession["Workaround"] = 0;
2) [Eksperimental] jika Anda bertahan dengan cookie, pastikan batas waktu / panjang OWIN Anda lebih lama dari sessionTimeout Anda di web.config Anda (dalam pengujian)