У меня есть сайт MVC, который использует провайдеров членства для аутентификации на нескольких доменах.
Я использую SESSION для хранения displayName моего пользователя, которое я затем отображаю в своем _Layout.cshtml
Это все прекрасно работает на моем локальном хосте, но когда я развертываю свое приложение на VM / Server, SESSION становится пустым, и я получаю объект не установлен на экземпляр объекта, и ошибка указывает на строку на моей странице макета, где я отобразить полное имя пользователя. Это происходит после истечения времени ожидания сеанса, когда пользователь запрашивает новую страницу, и ему необходимо снова войти в систему.
Вот мой метод входа:
if (!ModelState.IsValid)
{
return View(model);
}
Session["UserName"] = "Unknown User";
Logger.Instance.Info("Setting username to unknown user");
var msg = string.Empty;
var user = _userSvc.GetLoginUserData(model.Username, out msg);
if (!string.IsNullOrEmpty(msg))
{
Logger.Instance.Info("getting user info but error returned: "+msg);
ModelState.AddModelError("", msg);
return View(model);
}
Logger.Instance.Info("User was found "+user.EMAIL);
foreach (MembershipProvider provider in Membership.Providers)
{
var username = user.LEGACY_USERNAME;
if (provider.Name == "ADENTMembershipProvider") username = user.ENT_USERNAME;
try
{
Logger.Instance.Info("Authenticating user "+username+" to "+provider.Name);
if (provider.ValidateUser(username, model.Password))
{
Session["UserName"] = user.FIRST_NAME + ' ' + user.LAST_NAME;
Logger.Instance.Info("User authenticated " + Session["UserName"]);
var authTicket = new FormsAuthenticationTicket(
1, // version
user.ID.ToString(), // user name
DateTime.Now, // created
DateTime.Now.AddMinutes(2), // expires
false, // persistent?
user.ROLE // can be used to store roles
);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
if (returnUrl != null && returnUrl != "/")
{
Logger.Instance.Info("Redirecting user to " + returnUrl);
Response.Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
catch (Exception ex)
{
Logger.Instance.Error("Error authenticating user " + username + " to " + provider.Name, ex);
}
}
SynLogger.Instance.Info("User could not be authenticated " );
// User was not authenticated in any of the AD
ModelState.AddModelError("", "Invalid login attempt. The username or password provided is incorrect.");
return View(model);
Вот строка в моем макете, которая вызывает проблему, когда время сеанса истекло и пользователь повторно входит в систему:
<a href="#">Hello @Html.Raw(Session["UserName"].ToString())</a>
Не уверен, почему это работает на моей машине разработки, но не при развертывании на сервере.
Есть ли другой способ сохранить имя пользователя, отличное от SESSION, чтобы я мог получить к нему доступ к своей странице макета?