Owin tanımlama bilgisi kimlik doğrulamasını kullanırken tuhaf bir sorun yaşıyorum.
IIS sunucu kimlik doğrulamamı başlattığımda, IE / Firefox ve Chrome'da mükemmel şekilde çalışıyor.
Kimlik Doğrulama ile bazı testler yapmaya ve farklı platformlarda oturum açmaya başladım ve garip bir hata ile karşılaştım. Zaman zaman Owin çerçevesi / IIS tarayıcılara herhangi bir çerez göndermez. Kodun çalıştığı doğru olan ancak tarayıcıya hiçbir çerez gönderilmeyen bir kullanıcı adı ve şifre yazacağım. Sunucuyu yeniden başlatırsam çalışmaya başlar ve bir noktada oturum açmayı deneyeceğim ve çerezlerin teslim edilmesini durduracağım. Kodun üzerinden geçmek hiçbir şey yapmaz ve hata atmaz.
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);
}
}
}
});
Ve oturum açma prosedürümde aşağıdaki koda sahibim:
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);
Güncelleme 1: Sorunun nedenlerinden biri, oturuma öğeler eklediğimde sorunların başlaması gibi görünüyor. Gibi basit bir şey eklemek Session.Content["ABC"]= 123
sorunu yaratıyor gibi görünüyor.
Yapabileceklerim aşağıdaki gibidir: 1) (Chrome) Giriş yaptığımda ASP.NET_SessionId + kimlik doğrulama çerezimi alıyorum. 2) Bir session.contents ayarlayan bir sayfaya gidiyorum ... 3) Yeni bir tarayıcı açın (Firefox) ve oturum açmayı deneyin ve bir ASP.NET_SessionId almıyor veya bir Kimlik Doğrulama Çerezi almıyor 4) İlk tarayıcıda ASP.NET_SessionId'ye sahiptir ve çalışmaya devam eder. Bu çerezi kaldırdığım dakika, ip adresi (10.xxx) ve localhost üzerinde çalıştığım diğer tüm tarayıcılarla aynı sorunu yaşıyor.
Güncelleme 2:ASPNET_SessionId
OWIN ile kimlik doğrulamasından önce login_load sayfamda ilk oluşturulmasını zorunlu kılın.
1) OWIN ile kimlik doğrulamadan önce Session.Content
ASP.NET_SessionId'yi başlatmak için oturum açma sayfamda rastgele bir değer oluşturuyorum 2) sonra kimlik doğrulaması yapıp başka oturumlar yapıyorum 3) Diğer tarayıcılar artık çalışıyor gibi görünüyor
Bu tuhaf. Sadece bunun ASP ve OWIN'in farklı alanlarda olduklarını veya buna benzer bir şey olduğunu düşünmeleriyle bir ilgisi olduğu sonucuna varabilirim.
Güncelleme 3 - İkisi arasında garip davranış.
Ek garip davranış tanımlandı - Owin ve ASP oturumunun zaman aşımı farklı. Gördüğüm şey, Owin oturumlarımın bazı mekanizmalar aracılığıyla ASP oturumlarımdan daha uzun süre canlı kaldığı. Yani oturum açarken: 1.) Cookied tabanlı bir kimlik doğrulama oturumum var 2.) Birkaç oturum değişkeni belirledim
Oturum değişkenlerim (2), owin tanımlama bilgisi oturum değişkeninden önce "ölüyor", yeniden oturum açmaya zorluyor, bu da tüm uygulamamda beklenmeyen davranışlara neden oluyor. (Kişi giriş yaptı ancak gerçekte giriş yapmadı)
3B Güncellemesi
Biraz araştırma yaptıktan sonra, bir sayfada "formlar" kimlik doğrulama zaman aşımının ve oturum zaman aşımının eşleşmesi gerektiğini söyleyen bazı yorumlar gördüm. Normalde ikisinin senkronize olduğunu düşünüyorum ama her ne sebeple olursa olsun ikisi senkronize değil.
Geçici Çözümlerin Özeti
1) Her zaman kimlik doğrulamasından önce bir Oturum oluşturun. Uygulamayı başlattığınızda temel olarak oturum oluşturunSession["Workaround"] = 0;
2) [Deneysel] Çerezleri devam ettirirseniz, OWIN zaman aşımınızın / uzunluğunuzun web.config'inizdeki (test sırasında) sessionTimeout'tan daha uzun olduğundan emin olun