【发布时间】:2016-09-02 22:45:56
【问题描述】:
简介
我正在使用 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" });
}
}
如您所见,如果需要,我会返回一个带有 success 属性和 error 的 Json 对象。
然后由页面中的回调方法处理,然后显示微调器和独角兽以及其他魔法。
如果成功,则关闭模式并显示“成功”消息。
如果不成功并返回错误,则会在错误div 中填充我发回的错误消息。听起来很简单?..
场景
假设用户的会话令牌仅持续 15 分钟 - 并且正在滑动(每个新请求都会重置它(不一定对问题至关重要))。他们没有使用“记住我”选项。
如果他们空闲/停留在页面上的时间超过了分配的时间,那么令牌就会用完。
显然,此时他们的会话令牌已过期,他们将需要重新登录。
导航到[Authorize] 控制器操作时会发生通常的行为:使用ReturnUrl=xyz 查询字符串将用户带回登录页面。
想象一下
那么,回到模态的 Ajax 表单。
用户已在页面上停留了 15 分钟,他们的令牌现已过期。
他们单击按钮执行[Authorize]d 操作...
Action方法没有执行,WebApp返回一个重定向到登录页面。
但是通过这个 Ajax 调用返回的是整个登录页面。并且看到没有success,回调函数接收重定向,这会挤压登录页面 - 全部进入这个小tiny div。
你不需要我告诉你这看起来很可怕。
问题
很明显,WebApp 实现了[Authorize] 属性,并且用户已注销。
我无法在 Action 中设置任何断点,因为 [Authorize] 接管并自动重定向。
所以,我要问的是:
如何绕过/克服/解决这个问题,首先触发 [Authorize] 并且不执行 Action 代码块?
我们一如既往地感谢您的善意建议、回答和一般指导。
【问题讨论】:
标签: c# asp.net ajax authorize-attribute authorize