2012-03-12 18 views
6

Używam FormsAuthentication, ale dodałem niestandardowy element MemberShipProvider w celu sprawdzania poprawności względem niestandardowej tabeli użytkowników.Najlepsza praktyka w utrzymywaniu identyfikatora użytkownika (MVC)

Wszystkie tabele zawierające "dane użytkownika" mają kolumnę idUser, więc muszę zachować identyfikator użytkownika, aby przedstawić użytkownikowi jego dane.

Poprzednio użyłem zmiennej sesji (ASP.NET Webform), ale ponieważ przepisuję webaplikację do MVC, chciałbym zapytać, co jest ogólnie uważane za najlepsze podejście do tego.

Czy zmienna sesji jest nadal najlepszym miejscem do przechowywania identyfikatora użytkownika, czy powinienem dodać niestandardowy "Current.User.Identity", który oprócz nazwy użytkownika posiada także publiczny userID?

Czy powinienem wybrać zupełnie inne podejście?

Odpowiedz

3

Miałem to samo pytanie, gdy zaimplementowałem dostawcę niestandardowego członkostwa dla MVC. Skończyło się na zrobieniu dwóch rzeczy. Przechowuję identyfikator użytkownika w polu ProviderUserKey obiektu MembershipUser. Zobacz provideruserkey. Następnie, aby odpowiedzieć na twoje pytanie, tak, stworzyłem niestandardową zasadę z System.Web.Security.IPrincipal, ale później odziedziczyłem po System.Web.Security.RolePrincipal, ponieważ chciałem wspierać Role.

public class MyPrincipal : RolePrincipal 
{ 
    public Guid Id { get; set; } 

    public MyPrincipal(string providerName, IIdentity identity, Guid id) : base(identity) 
    { 
     Id = id; 
    } 
} 

Aktualizacja: Powodem nie chciałem używać sesji w moim przypadku jest wyłączona, ponieważ mam go do aplikacji. Czytałem, że podstawową koncepcją MVC jest oddzielenie problemów i to ściśle modeluje sposób działania sieci, który jest bezpaństwowy. Chociaż nie pamiętam, gdzie teraz to czytam, staram się pamiętać. Jednak pamiętam też czytanie, że jeśli możesz wyeliminować sesję, powinieneś to zrobić. Pozwoli to serwerom IIS obsługiwać jednocześnie żądań z aplikacji, zamiast czekać na zakończenie jednego żądania (i zwolnić sesję użytkownika), zanim następne żądanie będzie mogło skorzystać z sesji i wysłać odpowiedź. Największy wpływ na to jest ładowanie zawartości strony za pomocą Ajax.

+0

Dziękujemy! Myślałem o podobnym podejściu. Chociaż zgadzam się z powyższym @Mark S., najprościej jest użyć obiektu sesji. – Kman

+0

Dodano szczegóły, dlaczego uniknąłem sesji –

+0

Sesja niekoniecznie jest zła i może być koniecznością. Często widzę, że użytkownicy wyłączają sesję i zaczynają zbyt mocno polegać na plikach cookie zwiększających rozmiar każdego żądania HTTP. Innym sposobem obsługi jednoczesnych żądań jest użycie kontrolerów asynchronicznych, co jest dość łatwe w wersji beta MVC4 i może być wykonane przy odrobinie pracy w poprzednich wersjach. – Mark

3

Czy Twoje nazwy użytkowników są unikatowe? Jeśli tak, nie musisz utrzymywać UserId, ponieważ możesz po prostu pobrać użytkownika według nazwy użytkownika.

Moje projekty MVC wdrożyły członkostwo w bardzo podobny sposób jak tradycyjna aplikacja Web Forms. Nie sądzę, aby istniały jakiekolwiek powody, aby patrzeć na te dwie różne rzeczy, chyba że próbujesz zbudować bezstanową aplikację typu REST. Jak utrzymałeś swój UserId w Web Forms? Sesja? Następnie użyj sesji w MVC. Nie ma powodu, aby wymyślać koło.

Oczywiście, jeśli masz inne powody do zmiany, istnieje wiele sposobów przechowywania UserId. Możesz przechowywać go w UserData pliku cookie uwierzytelniania. Można również utworzyć własny bilet uwierzytelniania, który używa identyfikatora użytkownika jako klucza, a nie nazwy użytkownika. Można nawet utworzyć niestandardowego zleceniodawcę, aby przechowywać dodatkowe informacje.

Być może chcesz przejrzeć Forms Authentication Configuration and Advanced Topics. W tym artykule opisano przechowywanie dodatkowych danych (UserId) w mandacie uwierzytelniającym i tworzenie niestandardowego zleceniodawcy. Obie metody prawdopodobnie pasują do twoich wymagań.

+0

Nazwy użytkowników są unikalne, ale potrzebuję przyczyny ID użytkownika, która jest kolumną tożsamości w moim modelu (bazie danych). A więc pobierz dane z tabeli, której potrzebuję, aby wysłać zapytanie z ... gdzie id_użytkownika = idUser. Zajrzę do podanego linku :) – Kman

+0

Sesja to najprostszy i najszybszy sposób na utrzymanie UserId. Korzystanie z MVC z pewnością nie wyklucza użycia sesji. Moje 2 centy, użyj sesji. – Mark

+0

Zgadzam się. To działa dobrze w mojej aplikacji do obsługi webform. Moim głównym zmartwieniem było to, że w MVC podejście to było "przestarzałe". Dzięki jeszcze raz!:) – Kman

Powiązane problemy