2010-11-18 14 views
1

Özel üyelik sağlayıcısı oluşturdum ve UserName yerine MembershipUser.ProviderUserKey üzerinde çalışmam benim için daha uygun. Yani, böyle bir kod gerçekleştirmek ProviderUserKey almak için:ASP.NET User.Identity.Name alternatif?

if (User.Identity.IsAuthenticated) 
{ 
    int UserID = (int)Membership.GetUser(User.Identity.Name).ProviderUserKey; 
} 

GetUser() yöntem yürütüldüğünde Ancak, kullanıcı verileri veritabanından alınır edilmeli ve bu beni dinletiyor. Bu, sunucu zamanının gereksiz israfı, bu sefer ne kadar kısa olursa olsun, bundan kaçınmak istiyorum.

örneğinde olduğu gibi daha uygun bir şekilde ProviderUserKey almak için başka bir yolu var mı?

Fikirlerinizi duymak isterim. Bu sorunu web sayfalarınızda nasıl çözersiniz?

Teşekkürler.

cevap

5

Üyelik API'si, bu bilginin saklandığı yegane yer olduğu için veritabanına vurmaktır. User.Identity.Name, her istekte gönderilen bir çerezden kayıtlı kullanıcı adını getiriyor. Özel bir genel ilke uygulayabilir ve gerekli bilgileri çerezde şifrelenmiş kimlik doğrulama biletinin userData bölümüne kaydedebilirsiniz. İşte bu konuyu kapsayan bir article.

+0

Teşekkürler, bana bu konuyla ilgili bazı bilgileri gösterir misiniz? Tüm ben .NET 1.1 endişeleri buldum ve bu çerçevenin 3.5 sürümünde yapmak istiyorum. – Wodzu

+0

Burada [makale] (http://www.xoc.net/works/tips/forms-authentication.asp) adresinde bir GenericPrincipal'in nasıl kullanılacağını gösteren ve çerezde ek bilgilerin saklandığı yer verilmiştir. Buradaki fikir, HttpContext.Current.User'i bu özel prensip ile değiştirmektir, böylece her yerde erişilebilirdir. –

+0

Teşekkürler, ama anladığım kadarıyla, bu örnek, kendi zayıflama kontrollerini yapmaya dayanmaktadır. Standart davranışı geçersiz kılmalıydım ... Standart giriş denetimleri kullanıyorum. Uygulamamda daha sonra başvurmak için bir tane daha mülkün uygun bir şekilde ifşa edilmesi için bazı sınıfları genişletemem? – Wodzu

3

İlk oturum açtıklarında ve kullanıcının oturum koleksiyonunda saklarken veritabanından ProviderUserKey okuyabilirsiniz. Sonraki isteklerinizde, veritabanına gitmeden sadece oturumu kapatabilirsiniz.

+0

Aynı şeyi düşünüyordum ama bir şekilde Kimlik sınıfını genişletmek için daha zarif bir yol olurdu ... – Wodzu

+0

Kimlik sınıfının genişletilmesi ile ilgili sorun, Kullanıcı’nın kendi kimliğiniz yerine kendi kimlik sınıfınızı oluşturmasının bir yolu olmadığıdır. Öyleyse kendi IPrincipal'ınızı oluşturmanız gerekir. Bu noktada, tüm bu özel kodla ilgili olası sorunların çok küçük bir performans kazancından daha ağır olduğunu düşünmelisiniz. – Greg