在用户注销后使用[Authorize]属性发布Ajax表单ASP.NET

时间:2016-09-02 22:45:57

标签: c# asp.net ajax authorize-attribute authorize

简介

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

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

用户必须登录才能进入此特定页面并执行此特定操作 - 因此我使用[Authorize]属性进行必要的控制器操作。

让我们说控制器操作表单是POSTing,看起来像这个(伪代码,只是一个例子)

[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将重定向返回到Login页面。

但是通过此Ajax调用返回的内容是整个登录页面。并且看到没有success,回调函数接收重定向,该重定向会压缩Login页面 - 全部进入这个小 tiny div

你不需要我告诉你这看起来很可怕。

问题

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

我无法点击操作中的任何断点,因为[Authorize]会接管并自动重定向。

所以,我问的是:

如何首先触发[Authorize]并且未执行动作代码块,从而绕过/克服/解决此问题?

您的善意建议,答案和一般指导一如既往地受到赞赏。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以创建自定义属性,这样您就可以将它们重定向到登录控制器,也可以将其重定向到您想要执行的任何操作。我所做的就是将它们返回到我的访问操作。当发生ajax onerror时,通过ajax重定向。

  public class ApiAuthAttribute : AuthorizeAttribute
  {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {

        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var urlHelper = new UrlHelper(filterContext.RequestContext);
                filterContext.HttpContext.Response.StatusCode = 403;
                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "NotAuthorized",
                        LogOnUrl = urlHelper.Action("AccessDenied", "Login")
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }



    }

}

检查此答案redirects to login if unauthorized ajax call