0

一个使用带有 jQ​​uery 和 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();
    }
4

1 回答 1

1

尝试使用

Request.IsAjaxRequest()

检测ajax请求。它是 System.Web.Mvc 中的扩展方法。

或者您可以手动检查:

bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";

有了这个,您可以进行拦截和测试以进行身份​​验证,并采取相应的行动。您可以选择不显示布局或停止整个请求并发送到登录页面。

于 2013-01-25T16:51:26.587 回答