一个使用带有 jQuery 和 Ajax 的 MVC3 的数据收集站点。该站点正在使用选项卡(jquery ui 选项卡),作为部分加载并且每个都连接到 ajax-forms。因此,每个选项卡仅在“自身”内加载和提交。
但这会导致自动注销和重定向到 LogOn 出现问题。例如,当我按下一个新标签时,将触发注销。然后,此选项卡将使用完整的登录页面呈现,而不是刷新“父/顶部”窗口。因此,整个站点都反映在其中一个选项卡中(就像使用框架时经常发生的那样)。不过,网站上没有使用框架或 iframe。
可能解决它的一种方法是在 OnBegin 中拦截 ajax 调用,以检查用户是否已登录。如果没有将整个窗口 url 重定向到 /Account/LogOn。我不确定如何实现这一点,或者这是否是最好的方法。有关执行的任何想法或更好地处理此问题的提示?
一些代码示例:
Edit.cshtml,片段:选项卡
<div id="tabs">
<ul>
<li><a href="@Url.Action("PatientGeneralTab", new { guid = @Model })"><span>General</span></a></li>
<li><a href="@Url.Action("PatientVisitTab", new { guid = @Model })"><span>Visit</span></a></li>
<li><a href="@Url.Action("PatientDiaryTab", new { guid = @Model })"><span>Treatment</span></a></li>
<li><a href="@Url.Action("PatientReactionTab", new { guid = @Model })"><span>Adverse Drug Reaction</span></a></li>
</ul>
</div>
General.cshtml,部分,片段:Ajax.BeginForm()
@using (Ajax.BeginForm("StoreGeneral",
new { },
new AjaxOptions { HttpMethod = "POST", OnBegin = "Saving", OnSuccess = "SavedOk(); reloadPatientHeader();" },
new { id = "form-general" }))
{
form content here.
}
Web.config,身份验证
<authentication mode="Forms">
<!-- TODO: Change back to 60 -->
<forms loginUrl="/Account/LogOn" timeout="2" />
</authentication>
不确定我是否需要发布任何其他代码片段。如果是这样,请告诉我。
编辑
我偶然发现了这个与我有类似问题的问题。但是我无法向控制器添加任何代码,因为整个控制器类都包含在“[Authorize(Roles="xxx,yyy")]”中,因此登录检查发生在实际控制器操作之前。
我试图在“LogOn”下拦截 AccountController 中的调用,但随后它最终陷入无限循环:)
public ActionResult LogOn()
{
bool isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
if (isAjaxRequest && !Request.IsAuthenticated)
{
//Response.Headers["X-Requested-With"] = "";
return RedirectToAction("LogOn");
}
return View();
}
解决方案
作为参考,这是我最终使用的:
public ActionResult LogOn()
{
bool isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
if (isAjaxRequest && !Request.IsAuthenticated)
{
return JavaScript("window.location = '/Account/LogOn'");
}
return View();
}