6

Rozpocząłem projekt ASP.NET MVC 2 i buduję z kodu, który został wygenerowany automatycznie.Jak załadować profil nowo zalogowanego użytkownika przed przekierowaniem

Problem, którego doświadczam, polega na tym, że po zalogowaniu użytkownika okazuje się, że profil nowo zalogowanego użytkownika nie jest załadowany do HttpContext, więc otrzymuję komunikat ProviderException z komunikatem "Ta właściwość nie można ustawić dla anonimowych użytkowników "podczas próby ustawienia wartości właściwości w profilu bieżącego użytkownika.

na stanowisko tylko do akcji logowania, Visual Web Developer 2010 ekspresowe zasadzie generowane:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
     //... 

gdzie FormsService jest właściwością regulatora typu FormsAuthenticationService (również generowanego):

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); 

     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 
} 

Po linii FormsService.SignIn(model.UserName, model.RememberMe) założyłem, że informacje dotyczące nowo zalogowanego konta będą natychmiast dostępne dla kontrolera, ale wydaje się, że tak się nie dzieje. Jeśli na przykład dodaję profile.SetPropertyValue("MyProfileProperty", "test") pod wezwaniem do FormsService # SignIn, otrzymam ProviderException "Ta właściwość nie może być ustawiona dla anonimowych użytkowników".

Jak załadować nowo zalogowany profil użytkownika do HttpContext, aby ustawić wartość właściwości w jego profilu przed następnym żądaniem?

Odpowiedz

6

Nazywanie funkcji jest sprzeczne z intuicją, ale ProfileBase.Create (nazwa użytkownika) będzie załadować istniejący profil do istniejącego użytkownika lub utworzyć nowy profil, jeśli żaden nie istnieje.

var profile = ProfileBase.Create(userName); 

To nie będzie załadować profilu na ControllerContext.HttpContext.Profile ale przynajmniej można uzyskać dostęp lub zmienić profil użytkownika.

+0

Spowoduje to utworzenie nowego profilu, a nie załadowanie istniejącego. –

+0

Nie, nie masz racji zakładając, że załaduje istniejący profil. Wypróbuj to. –

+1

"Zajęło mi trochę czasu, zanim zorientowałem się, że wywołanie funkcji ProfileBase.Create() z nazwą użytkownika jako argumentem powoduje wykonanie wyszukiwania względem TableStorage i pobranie danych powiązanych z tą nazwą użytkownika. jest mylący, oczekiwałbym Load() lub Get(). " zobacz odpowiedź na to pytanie: http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

1

"Surowe" uwierzytelnianie formularzy wbudowane w szablon MVC nie powoduje automatycznego załadowania profilu. Wszystko, co robi, to sprawdzanie użytkownika przed tabelami członkostwa i ustawienie pliku cookie logowania. Jeśli chcesz dane profilu przetrwały w stanie na sesji logowania, musisz to zrobić jawnie:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       LoadProfile(model.UserName); 
      } 
    } 

    private void LoadProfile(string UserName) 
    { 
      MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context 
      var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault(); 
      Session.Add("CurrentUser", user); 
    } 

UPDATE:

ja źle oryginalne pytanie. Musisz utworzyć i zapisać profil typu ProfileCommon dla anonimowych użytkowników. Zobacz ten post:

http://forums.asp.net/p/1150958/2619264.aspx

+0

Domyślam się, że profil jest ładowany do sesji po załadowaniu "następnej" strony po zalogowaniu. Czy to prawda? –

+0

@Nick: W tej implementacji profil jest ładowany do sesji bezpośrednio po sprawdzeniu poprawności przed przekierowaniem. –

+0

To może być głupie pytanie, ale w jaki sposób to ładuje profil ('ControllerContext.HttpContext.Profile') nowo zalogowanego użytkownika? –

Powiązane problemy