Вот пример использования моего входа в систему с использованием CustomMembershipProvider
- Пользовательские журналы в MembershipProvider проверяют учетную запись пользователя
- Свойство пользователя для членства установлено для сведений о пользователе, поступающих из базы данных
- Создан билет для проверки подлинности
- Добавлен файл cookie проверки подлинности с помощью форм.
- Пользователь вошел в систему
Вот пример использования моей проблемы
- Остановить, когда сервер веб-разработки
- Запустить сервер веб-разработки, и пользователь все еще вошел в систему (из-за файла cookie?)
- Свойство пользователя Членство установлено равным нулюиз-за перезапуска / сбоя сервера
- Приложение выдает исключение из-за нулевого пользовательского значения
Единственное решение, о котором я могу подумать, это очистить все куки в 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("/");
}
Предложения ниже не осуществимыпотому что всякий раз, когда я перезагружаю сервер, дело обстоит именно так.
- Request.IsAuthenticated - FALSE для Application_BeginRequest;
- Request.IsAuthenticated - TRUE для моего 'View'
почему это происходит?