Файл cookie проверки подлинности с помощью форм не истекает при завершении работы / сбое сервера - PullRequest
0 голосов
/ 05 января 2011

Вот пример использования моего входа в систему с использованием CustomMembershipProvider

  1. Пользовательские журналы в MembershipProvider проверяют учетную запись пользователя
  2. Свойство пользователя для членства установлено для сведений о пользователе, поступающих из базы данных
  3. Создан билет для проверки подлинности
  4. Добавлен файл cookie проверки подлинности с помощью форм.
  5. Пользователь вошел в систему

Вот пример использования моей проблемы

  1. Остановить, когда сервер веб-разработки
  2. Запустить сервер веб-разработки, и пользователь все еще вошел в систему (из-за файла cookie?)
  3. Свойство пользователя Членство установлено равным нулюиз-за перезапуска / сбоя сервера
  4. Приложение выдает исключение из-за нулевого пользовательского значения

Единственное решение, о котором я могу подумать, это очистить все куки в Application_Start (), но я незнать, как это вообще возможно, поскольку запрос во время запуска приложения находится вне контекста.

У вас есть идеи, как решить эту проблему?

Вот код:

CustomMembershipProvider

public class CustomMembershipProvider : MembershipProvider
{
    #region Unimplemented MembershipProvider Methods
    //Other methods here
    #endregion

    //private IUserRepository _userRepository = new UserRepository();

    //Ninject bindings
    private IUserRepository _userRepository;

    [Inject]
    public IUserRepository UserRepository
    {
        set
        {
            _userRepository = value;
        }
    }

    private IProfileRepository _profileRepository;

    [Inject]
    public IProfileRepository ProfileRepository
    {
        set
        {
            _profileRepository = value;
        }
    }


    public User User
    {
        get;
        private set;
    }

    public Profile Profile
    {
        get;
        set;
    }


    public CustomMembershipProvider()
    {
        MvcApplication.Container.Inject(this);
    }

    public override bool ValidateUser(string username, string password)
    {
        if (string.IsNullOrEmpty(password.Trim())) return false;

        User user = _userRepository.GetUserByUsername(username);

        user.UserType = UserHelper.GetUserTypeById(user.UserTypeId);

        if (user == null) return false;

        string hash = PasswordHelper.ComputeHash(password, user.PasswordSalt);

        if (user.Password == hash)
        {
            this.User = user;

            Profile profile = _profileRepository.GetProfileByUserId(user.UserId);

            this.Profile = profile;
            return true;
        }

        return false;
    }
}

Вот метод входа в систему Контроллер учетных записей

        [HttpPost]
        public ActionResult Login(string username, string password)
        {

            if (!provider.ValidateUser(username, password))
            {
                TempData["LoginError"] = "Incorrect";
            }
            else
            {
                User user = provider.User;

                if (!user.Verified)
                {
                    TempData["LoginError"] = "Please verify your account";
                    return Redirect(Request.UrlReferrer.LocalPath);
                }

                //FormsAuthentication.SetAuthCookie(user.Username,false);
                FormsAuthenticationTicket authTicket = new
                               FormsAuthenticationTicket(1, //version
                               username,                    //user name
                               DateTime.Now,                //creation
                               DateTime.Now.AddMinutes(30), //Expiration
                               false,                       //Persistent
                               username);                   //since Classic logins don't have a "Friendly Name"

                string encTicket = FormsAuthentication.Encrypt(authTicket);
                Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

                WebsiteObjects.Profile profile = provider.Profile;


                TempData["LoginError"] = String.Empty;
            }


        return Redirect("/");

    }

Предложения ниже не осуществимыпотому что всякий раз, когда я перезагружаю сервер, дело обстоит именно так.

  1. Request.IsAuthenticated - FALSE для Application_BeginRequest;
  2. Request.IsAuthenticated - TRUE для моего 'View'

почему это происходит?

Ответы [ 2 ]

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

Вы должны выполнить шаг 2 для каждого запроса или сохранить данные пользователя в части UserData файла cookie аутентификации.

0 голосов
/ 12 января 2011

В проверке Application_AuthenticateRequest, если Request.IsAuthenticated = true, но объект User имеет значение null, а затем повторно его заполнить.

...