Здесь есть пара сценариев:
1. Весь контент защищен веб-формами <authorization>
:
Ваши пользователи заходят на страницу входа, потому что они перешли на часть сайта, защищенную с помощью элемента <authorization>
. В этом случае вам будет передан обратный URL в строке запроса: ReturnUrl
. Вы можете перенаправить пользователей обратно, откуда они пришли без SSL, используя:
return Redirect("http://" + Request.Url.Host + returnUrl);
2. Пользователи должны войти в систему, чтобы включить дополнительные функции:
Ваши пользователи нажимают на ссылку входа в систему, чтобы включить некоторые дополнительные функции, которые отключаются на ваших страницах, если они не вошли в систему. Например, возможность публиковать сообщения на форуме или просматривать премиум-контент.
В этом случае вы можете отслеживать, где они были до посадки на страницу входа. Этот пример основан на шаблонном приложении, которое вы получаете вместе с Visual Studio 2010 при создании нового приложения MVC3 (которое вы, возможно, использовали в качестве шаблона для своего проекта).
В этом примере приложения каждая страница использует главную страницу Site.Master
. Site.Master
делает Html.RenderPartial("LogOnUserControl")
, чтобы отобразить ссылку для входа на каждой странице. Откройте LogOnUserControl.ascx
и измените код для входа в систему ActionLink
на:
else
{
if(!Request.RawUrl.Contains("/Account/LogOn"))
{
Session["WhereWasI"] = Request.Url.AbsoluteUri;
}
%>
[ <%: Html.ActionLink("Log On", "LogOn", "Account") %> ]
<%
}
Что мы в основном делаем для отслеживания страницы, на которой находится пользователь, если он не вошел в систему. Поскольку ссылка «Вход в систему» также отображается на самой странице входа в систему, мы должны исключить это, поэтому оператор if
:
if(!Request.RawUrl.Contains("/Account/LogOn"))
Затем в вашем методе обратной передачи AccountController.cs
Logon
вы можете вернуть пользователя туда, где он находился на сайте, но используя http
вместо https:
:
Я также включил перенаправление на не-SSL, если при аутентификации с помощью ASP.NET Forms returnUrl
:
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl))
{
//
// 1. All content is protected by web forms `<authorization>`:
// If there was a return URL then go back there
//
if(!String.IsNullOrWhiteSpace(returnUrl))
{
return Redirect("http://" + Request.Url.Host + returnUrl);
}
}
else
{
//
// 2. Users have to logon to enable additional features:
//
if (Session["WhereWasI"] != null)
{
return Redirect(
Session["WhereWasI"].ToString().Replace("https", "http"));
}
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("",
"The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Пример, возможно, немного упрощен, но вы должны понять общую идею.