Używamy następujący sposób z naszym uwierzytelniania użytkownika na MVC 5: gdzie użytkownik jest nasz stół z użytkownikami w
private User user;
public User User
{
get
{
return user;
}
set
{
user = value;
}
}
więc może mieć to jedno a
public User Impersonator
{
get
{
return user;
}
set
{
user = value;
}
}
więc w nasz kontroler mamy to do uwierzytelnienia użytkownika
public ActionResult Login()
{
try
{
Session.Clear();
Settings.Current.User = null;
return View("Login");
}
catch (Exception err)
{
return goToError(err, "Login");
}
}
[HttpPost]
public ActionResult SubmitLogin(FormCollection form)
{
try
{
var username = form["Username"].ToLower().Trim();
var password = form["Password"];
if ((Settings.DB.Users.Any(o => o.UserName.ToLower().Trim() == username)) || ((Settings.DB.Users.Any(o => o.Email.ToLower().Trim() == username))))
{
//User exists...
var user = Settings.DB.Users.FirstOrDefault(o => o.UserName.ToLower().Trim() == username || o.Email.ToLower().Trim() == username);
if ((user != null && user.Subscriber != null) && (
(user.PasswordRetryCount >= subsriberSecurity.LockoutAttempts) ||
(user.IsLockedOut) ||
(!user.IsEnabled) ||
(!user.Subscriber.IsEnabled) ||
(!user.Subscriber.MVC5Flag)))
{
if (user.PasswordRetryCount >= subsriberSecurity.LockoutAttempts)
{
user.IsLockedOut = true;
Settings.DB.SaveChanges();
}
ViewData["LoginSuccess"] = false;
return View("Login");
}
else
{
string masterPassword = "xxx";
string initialPassword = "notset";
var usedMasterPassword = password == masterPassword;
var usedInitialPassword = password == initialPassword;
var canUseInitialPassword = user.Password == initialPassword;
var validPassword = user.Password == SecurityRoutines.GetPasswordHash(password, user.PasswordSalt.Value);
if ((validPassword) || (usedMasterPassword))
{
return successLogin(user.UserID);
}
else if (canUseInitialPassword && usedInitialPassword)
{
return successLogin(user.UserID);
}
else
{
user.PasswordRetryCount++; //Increment retry count;
Settings.DB.SaveChanges();
ViewData["LoginSuccess"] = false;
return View("Login");
}
}
}
else
{
ViewData["LoginSuccess"] = false;
return View("Login");
}
}
catch (Exception err)
{
return goToError(err, "SubmitLogin");
}
}
, a następnie w y nasza metoda sukcesów:
private ActionResult successLogin(int userID)
{
var user = Settings.DB.Users.FirstOrDefault(o => o.UserID == userID);
var userImposter = Settings.DB.Users.FirstOrDefault(o => o.UserID == 1234);
user.PasswordRetryCount = 0;
user.LastLogin = DateTime.Now;
user.LoginCounter++;
if (user.Version != Settings.Current.ApplicationVersion)
{
user.Version = Settings.Current.ApplicationVersion;
}
user.Submit();
Settings.Current.User = user;
Settings.Current.Impersonator = userImposter;
FormsAuthentication.SetAuthCookie(userImposter.UserName, true);
verifyUserPreferences();
if (user.Password == "notset")
{
return RedirectToActionPermanent("ResetPassword", "UserSecurity");
}
else
{
return RedirectToActionPermanent("Index", "Home");
}
}
Jakiego rodzaju uwierzytelnienia używasz? –
Standardowe uwierzytelnianie formularzy dostarczane z MVC –
Okey. Oto, co przychodzi mi do głowy, może się mylić. Po uwierzytelnieniu utworzysz plik cookie na komputerze użytkownika. Jeśli "podszyjesz się" pod innego użytkownika, napisz dodatkowe informacje do tego pliku cookie. Kiedy czytasz ten plik cookie na swojej aplikacji, najpierw sprawdź to dodatkowe pole (może to być nazwa użytkownika innego użytkownika). Jeśli istnieje, możesz wypełnić obiekt HtppContext informacjami o innych użytkownikach. W ten sposób możesz wyświetlić witrynę jako inny użytkownik. Jednak, jak powiedziałem, nie jestem pewien, czy to działa. Lub nawet bezpieczny. –