czwartek, 22 stycznia 2009

ASP .NET MVC & Membership

Wbrew pozorom wykorzystanie mechanizmu Membership And Role Providers na platformie ASP .NET MVC nie jest bardzo trudne.

Ja preferuję wykonanie do tego celu osobnego kontrolera (AccountController) oraz zaimplementowanie w nim metod służących do uwierzytelniania i autoryzacji użytkowników.

Przykładowy kod metody Login:

public ActionResult Login(string username, string password, bool? rememberMe)
        {
            ViewData["Title"] = "Login";
            // Non-POST requests
            if (Request.HttpMethod != "POST")
            {
                return View();
            }
            List<string> errors = new List<string>();
            if (String.IsNullOrEmpty(username))
            {
                errors.Add("You must specify a username.");
            }
            if (errors.Count == 0)
            {
                bool loginSuccessful = Membership.Provider.ValidateUser(username, password);
                if (loginSuccessful)
                {
                    FormsAuthentication.SetAuthCookie(username, rememberMe ?? false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    errors.Add("The username or password provided is incorrect.");
                }
            }
            ViewData["errors"] = errors;
            ViewData["username"] = username;
            return View();
        }

Pozostałe metody implementujemy analogicznie pamiętając że zapytanie do nich powinno przyść w metodzie typu POST.

5 komentarze:

Marek Blotny pisze...

Czesc Darek, ciekawy post! Mam tylko jedna watpliwosc - czy nie lepiej byloby uzyc metody FormsAuthentication.RedirectFromLoginPage(...) zamiast RedirectToAction("Index", "Home") ?

Bartek Szafko pisze...

słuszne to i sprawiedliwe

teraz tylko jeszcze do tego openid, liveid i cardspace i śmigamy :)

Dariusz Tarczyński pisze...

@Marek
Spostrzegawcza uwaga :-) W moim przypadku metoda RedirectFromLoginPage nie jest wymagana, a mówiąc inaczej, nie wprowadza nic nowego prócz przeniesienia użytkownika na stronę startową czyt. zdefiniowaną w Web.congig-u. Ja trochę z lenistwa nie umieściłem tej sekcji w moim Web.confgigu więc skoro cookies-a z poświadczeniami już mam wysłanego, to wystarczy zwykły redirect i efekt jest ten sam.

@Bartek
No tak, to mam zamiar dorobić niebawem :p

Marek Blotny pisze...

@Darek
A nie masz takiego przypadku, ze czesc stron jest dostepna tylko dla zalogowanych uzytkownikow? Jesli tak, to uzytkownik, po zalogowaniu, moze sobie taka strone dodac do ulubionych. Nastepnie wchodzac na nia zostanie oczywiscie automatycznie poproszony o zalogowanie sie. Po zalogowaniu sie, nie chcialby trafic na strone glowna, tylko na strone o ktora prosil, ktora ma w ulubionych. Dlatego zasugerowalem RedirectFromLoginPage()

Dariusz Tarczyński pisze...

@Marek
Akurat w tym przykładzie nie miałem takich stron. Jeśli bym miał, to oczywiście RedirectFromLoginPage byłby wręcz konieczne :-)