介绍

我正在使用C#中的ASP.NET MVC为客户端构建WebApp。

我在模态窗口中有一个Ajax表单,当用户单击按钮时会提交该表单。

用户必须先登录才能在该特定页面上执行此特定操作-因此,我将[Authorize]属性用于必要的控制器操作。

假设表单正在过帐的控制器操作如下所示(伪代码,仅是示例):

[Authorize]
public ActionResult DoAjaxThings(string field, string anotherfield)
{
    // ... do things
    if (success)
    {
        return Json(new { success = true });
    }
    else
    {
        return Json(new { success = false, error = "Something went wrong" });
    }
}


如您所见,我返回了一个Json对象,该对象带有success属性和一个error(如有必要)。

然后,这由页面中的回调方法进行处理,然后开始显示微调框和独角兽以及其他魔术。

如果成功,则关闭模态并显示“成功”消息。

如果未成功返回错误,则错误div会填充我发回的错误消息。听起来很简单?



情境

假设用户的会话令牌仅持续15分钟-并且正在滑动(每个新请求都会重置它(不一定对问题至关重要))。他们没有使用“记住我”选项。

如果他们闲置/坐在页面上的时间超过分配的时间,则令牌用完。

显然,到此为止,他们的会话令牌已经过期,他们将需要再次登录。

导航到[Authorize]控制器操作时,会发生通常的行为:使用ReturnUrl=xyz查询字符串将用户带回登录页面。



想象一下

因此,回到模态的Ajax形式。

用户在页面上停留了15分钟,其令牌现已过期。

他们单击按钮以执行[Authorize] d操作...

未执行Action方法,并且WebApp将重定向重定向到Login页面。

但是通过此Ajax调用返回的是整个登录页面。看到没有success,回调函数将收到重定向,它将重定向登录页面-全部都放入一个很小的div中。

您不需要我告诉您,这看上去令人毛骨悚然。





很明显,WebApp实现了[Authorize]属性,并且用户已注销。

我无法在Action中找到任何断点,因为[Authorize]会接管并自动重定向。

所以,我要问的是:

如何先触发[Authorize]而不执行Action代码块,才能绕过/克服/解决此问题?

一如既往地欢迎您提出的建议,答案和一般指导。

最佳答案

您可以删除[Authorize]属性,在控制器方法(if (User.Identity.IsAuthenticated))中检查授权,如果未授权用户,则将适当的错误返回给客户端。

关于c# - 用户注销ASP.NET后,使用[Authorize]属性发布Ajax表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39301563/

10-10 18:43