У меня есть приложение mvc 3, для которого я реализую авторизацию, используя свое собственное представление входа в систему, которое проверяет, разрешены ли имя пользователя и пароль, а затем устанавливает переменную в сеансе, чтобы сообщить, что пользователь вошел в систему. Этот видработ, но, с одной стороны, ведет себя странным и нежелательным образом.Упомянутое представление содержит форму, которую я использую для ввода некоторых данных и загрузки файла.По какой-то причине, которую я не могу выяснить, после публикации этой формы запускается новый сеанс, и поэтому переменная, которая помнила, что пользователь вошел в систему, сбрасывается в false, и впоследствии страница входа снова отображается.
Я заблудился относительно того, почему приложение начинает новый сеанс в этот момент?Я не поручил это сделать.Кто-нибудь может порекомендовать решения, чтобы остановить это поведение и заставить его сохранить старый сеанс?
Спасибо.
ОБНОВЛЕНИЕ - Некоторые код:
Обратите внимание, что сеанс, кажется, завершается сразу после ответа на отправленную Create
форму
Контроллер CMS, который использует собственный атрибут Autorize, называемый "RDAutorize" для всех действий:
[RDAuthorize]
public class PhotoCMSController : Controller
{
public ActionResult Create()
{
/* Code omitted: set up a newPhoto object with default state */
/* Display view containing form to upload photo and set title etc. */
return View("../Views/PhotoCMS/Create", newPhoto);
}
[HttpPost]
public ContentResult Upload(int pPhotoId)
{
/* Code ommited: receive and store image file which was posted
via an iframe on the Create view */
string thumbnail = "<img src='/path/to/thumb.jpg' />";
return Content(thumbnail);
}
[HttpPost]
public ActionResult Create(string pPhotoTitle, string pCaption etc...)
{
/*Code omitted: receive the rest of the photo data and save
it along with a reference to the image file which was uploaded
previously via the Upload action above.*/
/* Display view showing list of all photo records created */
return View("../Views/PhotoCMS/Index", qAllPhotos.ToList<Photo>());
/* **Note: after this view is returned the Session_End() method fires in
the Global.asax.cs file i.e. this seems to be where the session is
being lost** */
}
}/*End of CMS Controller*/
Пользовательский фильтр действий авторизации:
public class RDAuthorize : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Boolean authorized = Convert.ToBoolean(
HttpContext.Current.Session["UserIsAuthorized"]
);
if (!authorized) {
/* Not logged in so send user to the login page */
filterContext.HttpContext.Response.Redirect("/Login/Login");
}
}
public override void OnActionExecuted(ActionExecutedContext filterContext) {}
public override void OnResultExecuting(ResultExecutingContext filterContext) {}
public override void OnResultExecuted(ResultExecutedContext filterContext) {}
}/*End of Authorize Action Filter*/
Контроллер входа в систему:
public class LoginController : Controller
{
private PhotoDBContext _db = new PhotoDBContext();
public ActionResult Login()
{
string viewName = "";
Boolean authorized = Convert.ToBoolean(Session["UserIsAuthorized"]);
if (authorized)
{
viewName = "../Views/Index";
}
else
{
viewName = "../Views/Login/Login";
}
return View(viewName);
}
[HttpPost]
public ActionResult Login(string pUsername, string pPassword)
{
string viewName = "";
List<Photo> model = new List<Photo>();
var qUsers = from u in _db.Users
select u;
foreach (User user in qUsers.ToList<User>())
{
/* If authorized goto CMS pages */
if (pUsername == user.Username && pPassword == user.Password)
{
Session["UserIsAuthorized"] = true;
var qPhotos = from p in _db.Photos
where p.IsNew == false
select p;
model = qPhotos.ToList<Photo>();
viewName = "../Views/PhotoCMS/Index";
break;
}
}
return View(viewName, model);
}
}/* End of Login controller */