SORU
23 Aralık 2013, PAZARTESİ


ASP.NET_Sessionİd OWİN Çerezleri tarayıcı göndermeyin

Owin tanımlama bilgisi kimlik doğrulaması kullanarak garip bir sorun var.

IIS sunucum başladığımda kimlik doğrulama IE/Firefox ve Chrome üzerinde gayet iyi çalışıyor.

Kimlik Doğrulaması ile bazı testler yapıyor ve farklı platformlarda günlüğü başladım ve garip bir hata yaptım. Düzensiz Owin çerçeve / IIS sadece tarayıcılar için herhangi bir çerez göndermek istemiyor. Kullanıcı adını yazın ve doğru kod çalışır ama hiçbir çerez tarayıcı için hiç teslim alır şifre vereceğim. Ben sonra giriş yapın ve tekrar deneyeceğim bir noktada çalışmaya başlar sunucuyu yeniden başlatın kurabiyeleri teslim engel olur. Kod üzerinde adım, hiçbir şey yapmaz ve herhangi bir hata atar.

 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 işlemi içinde aşağıdaki kodu var:

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:Bu sorun için bir neden öğeleri ekledikten sonra problemler başlar oturuma gibi görünüyor. Basit bir şey ekleyerek Oturumu gibi.["ABC"]= 123 sorun yaratacak gibi görünüyor. içerik

Bulduklarıma aşağıdaki gibidir: 1) (Krom)ben giriş ASP.Benim kimlik tanımlama NET_Sessionİd. 2) oturumu ayarlar bir sayfaya gidiyorum.içindekiler... 3) yeni bir tarayıcı (Firefox) Açın ve giriş deneyin ve bir ASP almaz.NET_Sessionİd ne de kimlik Doğrulama Tanımlama bilgisi yok 4) buna Rağmen ilk tarayıcı ASP.Çalışmaya devam NET_Sessionİd. Duyduğum anda tüm tarayıcılar aynı sorun var bu cookie kaldırmak Ip adresi (10.üzerinde çalışıyorum x.x.x) ve localhost.

Güncelleme 2:ASPNET_Sessionİd oluşturulması ilk OWİN ile kimlik doğrulaması önce login_load sayfamda kuvvet.

1) kimlik doğrulaması önce OWİN ile rastgele bir Oturum yapmak.ASP başlangıç giriş sayfamda içerik değeri.NET_Sessionİd 2) Daha sonra ve daha sonraki oturumların ben kimlik doğrulaması yapmak 3) Diğer tarayıcılar artık çalışmıyor gibi görünüyor

Bu tuhaf bir durum. Sadece bu ASP ve OWİN farklı alanlardaki düşünce ile ilgili bir şey ya da onun gibi bir şey olduğunu söyleyebiliriz.

Güncelleme 3- İkisi arasında garip bir davranış.

Ek garip davranışları tespit - Owin ve ASP oturum zaman Aşımı farklıdır. Ben gördüklerime Owin seansları hayatta daha uzun bir mekanizma ile bir ASP seansları daha bizde kalacak. Zaman giriş: 1.) Cookied tabanlı kimlik doğrulama oturumu var 2.) Birkaç oturum değişkenleri ayarlayın

Benim oturum değişkenleri(2) "ölmek" owin çerez oturumu öncesinde tüm uygulama boyunca beklenmeyen bir davranış neden yeniden açma güçleri, değişken. (Kişi giriş yapmış ama gerçekten oturum) değildir

Güncelleme 3B -

Demek bir sayfada bazı yorumlar gördüm sonra biraz araştırma "formlar" kimlik doğrulama zaman aşımı ve oturum zaman aşımı maç gerekir. İki senkronize normalde düşünüyordum ama iki synch ne olursa olsun ben hazırım.

Geçici Çözümler özeti

1) Her Zaman kimlik doğrulaması ilk önce bir Oturum oluşturmak. Uygulama Oturumu başlattığınızda, temelde oturum oluşturmak [""] Çözüm = 0;

2) Eğer kurabiyeler çok OWİN zaman aşımı olun ısrar ederseniz [Deney] / uzunluğu web artık sizin sessionTimeout daha.config (test)

CEVAP
20 Ocak 2014, PAZARTESİ


Aynı sorunla karşılaştım ve neden ASP.NET hosting uygulama OWİN kadar uzanır. Bir hata olduğunu söyleyebilirim.

Bazı arka plan

Benim bulgular bu derleme sürümleri dayanmaktadır:

  • Microsoft.Owin,=2.0.2.0,=, Kültür tarafsız=31bf3856ad364e35 Sürüm PublicKeyToken
  • Microsoft.Owin.Ana.SystemWeb,=2.0.2.0,=, Kültür tarafsız=31bf3856ad364e35 Sürüm PublicKeyToken
  • Sistem.Web,=4.0.0.0,=, Kültür tarafsız=b03f5f7f11d50a3a Sürüm PublicKeyToken

OWİN yanıt Kurabiye ile çalışmak için kendi soyutlama kullanırMicrosoft.Owin.ResponseCookieCollection). Bu uygulama doğrudan yanıt başlıkları koleksiyonu sarar ve buna göre güncellenirSet-Cookiebaşlık. OWİN ASP.NET host (Microsoft.Owin.Ana.SystemWebsadece sararSistem.Web.HttpResponseve başlık koleksiyonu. Yeni çerez OWİN oluşturulduğunda, yanıtSet-Cookiebaşlık doğrudan değiştirilir.

Ama ASP.NET ayrıca kendi soyutlama yanıt Kurabiye ile çalışmak için kullanır. Bu bizim için de açıktırSistem.Web.HttpResponse.Kurabiyeözellik ve kapalı bir sınıf tarafından uygulananSistem.Web.HttpCookieCollection. Bu uygulama yanıt kaydırma değilSet-Cookiedoğrudan başlık ama iç bildirimleri bazı iyileştirmeler ve avuç yanıt nesnesine değişti devlet tezahür ettirmek için kullanır.

Sonra da bir ömür boyu geç isteğinde bir nokta varHttpCookieCollectiondeğişen durumu test edilir (Sistem.Web.HttpResponse.() GenerateResponseHeadersForCookiesve kurabiyeler sıralanmışSet-Cookiebaşlık. Eğer Bu koleksiyon, bazı özel durumda ise, tüm Çerez Başlığı önce temizlenmiş ve kurabiye koleksiyonu yeniden.

Oturum uygulama kullanır ASP.NETSistem.Web.HttpResponse.Kurabiyemülk, ASP saklamak için.NET_Sessionİd kurabiye. Ayrıca ASP.NET oturum durumu modülünün Bazı Temel optimizasyon (Sistem.Web.SessionState.SessionStateModuleoldukça kendinden statik özelliği s_sessionEverSet adlı açıklayıcı. uygulanan Eğer uygulamanızın oturum durumunu saklamak için bir şey varsa, bu modülü her istek için biraz daha fazla iş yapar.


Giriş sorunumuza geri dönelim

Tüm bu parçalar ile senaryo açıklanabilir.

Durum 1 - Oturum asla kuruldu

Sistem.Web.SessionState.SessionStateModuleözelliği false , s_sessionEverSet. Hayır oturum oturum durumu modülü tarafından üretilen ve kimliği vardırSistem.Web.HttpResponse.Kurabiyetoplama durumudurolarak değiştiğini tespit etti. Bu durumda OWİN doğru tarayıcı çerezler ve oturum açma işleri için gönderilir.

Durum 2 - Oturum uygulama içinde bir yerlerde, ama kullanıcı önce kullanılan kimlik doğrulamasını dener

Sistem.Web.SessionState.SessionStateModuleözelliği true , s_sessionEverSet. Oturum Kimliği tarafından oluşturulurSessionStateModuleASP.NET_Sessionİd eklenirSistem.Web.HttpResponse.Kurabiyedaha sonra kullanıcının oturum talep hayatı boyunca kaldırıldı ama koleksiyonu aslında boştur. Bu durumdaSistem.Web.HttpResponse.Kurabiyetoplama durumudurdeğişiklik algılandıveSet-CookieBaşlığı ilk kurabiye değer başlık sıralanmış önce temizlenir.

OWİN yanıt kurabiye bu durumda "kayıp" ve kullanıcı kimliği ve oturum açma sayfasına yeniden yönlendirilir.

Durum 3 - Oturum kullanıcı kimlik doğrulaması için önce kullanılır

Sistem.Web.SessionState.SessionStateModuleözelliği true , s_sessionEverSet. Oturum Kimliği tarafından oluşturulurSessionStateModuleASP.NET_Sessionİd eklenirSistem.Web.HttpResponse.Kurabiye. İç optimizasyon yüzündenSistem.Web.HttpCookieCollectionveSistem.Web.HttpResponse.() GenerateResponseHeadersForCookiesSet-Cookie Başlığı ilk temizlenmezama sadece güncellendi.

Bu durumda her iki kimlik doğrulama tanımlama ve ASP OWİN.NET_Sessionİd kurabiye yanıt olarak gönderilir ve giriş çalışır.


Kurabiye ile daha genel bir sorun

Gördüğünüz gibi sorun çok daha genel ve ASP.NET oturum ile sınırlı değildir. Üzerinden OWİN ev sahipliği yapıyorsanızMicrosoft.Owin.Ana.SystemWebve bir şeyi doğrudan kullanıyorSistem.Web.HttpResponse.Kurabiyekoleksiyon risk altındadır.

Örneğinbu çalışıyorve her iki tanımlama doğru tarayıcısına gönderilir

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";

    return View();
}

Amabu değilve OwinCookie""..

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";
    HttpContext.Response.Cookies.Remove("ASPCookie");

    return View();
}

Hem VS2013, İİSExpress ve MVC varsayılan proje şablonu test edilmiş.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • DrakeVEVO

    DrakeVEVO

    17 AĞUSTOS 2009
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011