2010-08-09 11 views
5

Burada bir OutputCache parametresini yoğun olarak kullandığım bir ASP.NET MVC 2 sitesi yapıyorum. Ancak, bir endişem var: önbelleğe almayı kullanmak, kimlik doğrulamasını etkileyebilir.ASP.NET MVC OutputCache'i kullanırken, kullanıcının kimliği doğrulanıp yansıtmadığına bağlı olarak içeriği görüntüle

Tüm sayfalarımda, kullanıcının oturum açıp açmadığını gösteriyorum. Ayrıca, bazı Görünümlerimde, bazı sayfa içeriğinin görüntülenip görüntülenmeyeceğini belirlemek için kullanıcı rolüne dayalı olarak filtreleme yapıyorum (örneğin, Düzenle Bağlantısının sayfalarımdan birinde yalnızca Moderatörün rollerinde bulunan kullanıcılara veya Yönetici).

OutputCache'i kullanarak bu Görünümlerimin dinamik olarak değiştirilmesine müdahale edersiniz? Öyleyse, önbelleğe alma işlemini ortadan kaldırmadan bu sorunu nasıl çözebilirim?

cevap

8

[OutputCache] ve [Authorize] öznitelikleri birbiriyle iyi oynarlar. AuthorizeAttribute.OnAuthorization() yöntemi, önbellekten sayfa sunulmadan önce yetkilendirme filtresini yeniden çalışmaya zorlayan çıkış önbelleğe alma sistemine bir kanca ayarlar. Yetkilendirme filtresi mantığı başarısız olursa, bir önbellek öznesi olarak kabul edilir. Yetkilendirme mantığı başarılı olursa, sayfa önbellekten sunulur. Dolayısıyla, bir eylemde [Yetkilendir (Roller = "Moderatör, Yönetici")] ve [OutputCache] varsa, geçerli kullanıcı Moderatör veya Yönetici rollerinde olmadıkça, sayfa önbellekten sunulmaz.

Bu 'un'un kullanıcı veya role göre değişmediğini unutmayın; Orijinal çekini tam anlamıyla yeniden çalıştırıyor. Kullanıcı A'nın (Moderatör) içeri geldiğine ve sayfanın önbelleğe alınmasına neden olduğunu düşünün. Artık Kullanıcı B (Yönetici) geliyor ve önbelleğe alınan sayfaya ulaşıyor. Yönetici ve Moderatör hem izin verilir beri [Yetkilendirme] onay başarılı olur, ve yanıt tepki ikamesi değil

Not olduğunu Kullanıcı A'ya sunulduğu tepki olarak tam aynı içeriği içerecektir Kullanıcı B'ye servis MVC 2'de çalışın. Potansiyel olarak hassas veriler sunuyorsanız, burada en iyi bahis önbelleğe alınmamaktır. Önbelleğe kesinlikle ihtiyacınız varsa, eksik verileri dinamik olarak doldurmak için bir AJAX geri çağırma kullanarak yanıt ikamesine benzer bir şeyi taklit edebilirsiniz.

+2

Yetki gerektirmeyen bir yöntemim varsa, ancak kullanıcı bir denetleyici ise Görünüm içinde bir Düzenleme bağlantısı eklerse ne olur? Bu durumda, bir sorunun altındaki bağlantının, bayrağın, düzenlemenin ve diğer düğmelerin nasıl çalıştığına benzeyen bir şeyi başarmaya çalışıyorum - bu da OutputCache'i kullanmıyor mu? Cevabınız için teşekkürler! –

+0

Sadece http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/ (daha sonra düzeltilen eski bir sorun hakkında) tökezledim, ki bu bana bir fikir verdi - Eğer OutputCache bununla o kadar kötüyse, kullanıcının oturum açıp açmadığına ve kullanıcının hangi rollere sahip olduğuna bağlı olarak farklı kopyalar yaratan özel bir önbellek özniteliği/filtresi ** oluşturmak mümkündür. Kullanıcı adı, sayfanın üst kısmında kullanıcının adını yazacağım - ** bu mümkün **? –

+0

Önbellek girişlerle dolup taşacak olduğundan, kullanıcı başına önbelleğe almak genellikle kötü bir fikirdir. Donut önbelleğe alma, senaryo için önemliyse, bir yanıt filtresi de kullanabilirsiniz. İsteğin başında, bazılarını anlayan bir filtre yükleyin [!! SUBSTITUTION DATA !!] deseninde, WriteSubstitute() öğesinin bu deseni yanıt akışına yazmasını sağlayın, ardından isteğinizin sonunda filtreniz gerçek Response.WriteSubstitution() yöntemini çağırır. – Levi

0

İhtiyacınız olan şeyin ASP.NET donanıma önbelleğe aldığına inanıyorum. İyi bir açıklama için here'a bakın. En iyi bar alanı için böyle bir şey kullanırsa şaşırmam.

+1

Bu bağlantı, MVC2 ... –

+0

içinde yapılması önerilmez. Kısmi önbelleğe alma, MVC 3'te yeniden kullanılabilir! Woot! – madcapnmckay

İlgili konular