Как загрузить профиль недавно вошедшего в систему пользователя перед перенаправлением - PullRequest
6 голосов
/ 19 января 2011

Я запустил проект ASP.NET MVC 2 и собираю код, созданный автоматически.

Проблема, с которой я сталкиваюсь, заключается в том, что после того, как пользователь вошел в систему, кажется, что профиль вновь вошедшего в систему пользователя не загружен в HttpContext, поэтому я получаю ProviderException с сообщением «Это свойство нельзя установить для анонимных пользователей» при попытке установить значение свойства в профиле текущего пользователя.

Для действия входа в систему только для POST Visual Web Developer 2010 Express в основном сгенерировал:

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

где FormsService - это свойство контроллера типа FormsAuthenticationService (также сгенерированное):

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();
    }
}

После строки FormsService.SignIn(model.UserName, model.RememberMe) я предполагал, что информация для вновь зарегистрированной учетной записи будет немедленно доступна для контроллера, но, похоже, это не так. Если, например, я добавлю profile.SetPropertyValue("MyProfileProperty", "test") ниже вызова FormsService # SignIn, то я получу ProviderException «Это свойство нельзя установить для анонимных пользователей».

Как загрузить профиль недавно вошедшего в систему пользователя в HttpContext, чтобы я мог установить значение свойства в его профиле перед следующим запросом?

Ответы [ 2 ]

6 голосов
/ 19 января 2011

Именование функции является интуитивно понятным, но ProfileBase.Create (имя пользователя) загрузит существующий профиль для существующего пользователя или создаст новый профиль, если его нет.

var profile = ProfileBase.Create(userName);

Это не приведет к загрузке профиля в ControllerContext.HttpContext.Profile, но, по крайней мере, вы сможете получить доступ или изменить профиль пользователя.

1 голос
/ 19 января 2011

Встроенная в шаблон MVC проверка подлинности с помощью «сырых» форм не загружает профиль автоматически. Все, что он делает - проверяет пользователя по таблицам членства и устанавливает cookie для входа. Если вы хотите, чтобы данные профиля сохранялись в состоянии сеанса при входе в систему, вам придется сделать это явно:

[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);
     }

ОБНОВЛЕНИЕ:

Я неправильно понял исходный вопрос. Вы должны создать и сохранить профиль типа ProfileCommon для анонимных пользователей. Смотрите этот пост:

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

...