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?
Spowoduje to utworzenie nowego profilu, a nie załadowanie istniejącego. –
Nie, nie masz racji zakładając, że załaduje istniejący profil. Wypróbuj to. –
"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 –