在用户注销 ASP.NET 后使用 [Authorize] 属性发布 Ajax 表单
POSTing Ajax form using [Authorize] attribute after the user is logged out ASP.NET
简介
我正在使用 C# 中的 ASP.NET MVC 为客户端构建 WebApp。
我在模态 window 中有一个 Ajax 表单,当用户单击按钮时它会被提交。
用户必须登录才能进入此特定页面并执行此特定操作 - 所以我使用 [Authorize]
属性来执行必要的控制器操作。
假设表单正在 POST 的控制器操作看起来像这样 (伪代码,只是一个例子):
[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" });
}
}
如您所见,我 return 一个 Json 对象返回一个 success
属性 和一个 error
(如果需要)。
然后由页面中的回调方法处理,然后显示旋转器和独角兽以及其他魔法。
如果成功,模式将关闭并显示 "success" 消息。
如果不成功并且出现错误 return,则错误 div
会填入我发回的错误消息。听起来很简单?..
场景
假设用户的会话令牌仅持续 15 分钟 - 并且正在滑动(每个新请求都会重置它(不一定对问题至关重要))。他们没有使用 "remember me" 选项。
如果他们在页面上 idle/sitting 的时间超过了分配的时间,则令牌将用完。
显然,此时他们的会话令牌已过期,他们将需要重新登录。
导航到 [Authorize]
控制器操作时会发生通常的行为:使用 ReturnUrl=xyz
查询字符串将用户带回登录页面。
想象一下
所以,回到模态的 Ajax 形式。
用户已在页面上停留 15 分钟,他们的令牌现已过期。
他们单击按钮执行 [Authorize]
d 操作...
Action 方法未执行,WebApp return重定向到登录页面。
但是 通过这个 Ajax 调用 return 的是整个登录页面。看到没有 success
,回调函数接收到重定向,它压缩了登录页面 - 全部变成了这个小 tiny div
.
你不需要我告诉你这看起来很丑陋。
问题
很明显,WebApp实现了[Authorize]
属性,用户已经登出
我无法在 Action 中设置任何断点,因为 [Authorize]
接管并自动重定向。
所以,我想问的是:
如何 bypass/overcome/solve 这个问题 [Authorize]
先被触发而 Action 代码块没有被执行?
我们一如既往地感谢您的建议、回答和一般指导。
您可以删除 [Authorize] 属性,检查控制器方法中的授权 (if (User.Identity.IsAuthenticated)
),如果用户未被授权,return 向客户端发送适当的错误。
你可以创建一个自定义属性,这样你就可以将它们重定向到登录控制器,到你想要的任何东西 do.what 我所做的是 return 它们到我的 accessdenied 操作。当发生 ajax 错误时,通过 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
简介
我正在使用 C# 中的 ASP.NET MVC 为客户端构建 WebApp。
我在模态 window 中有一个 Ajax 表单,当用户单击按钮时它会被提交。
用户必须登录才能进入此特定页面并执行此特定操作 - 所以我使用 [Authorize]
属性来执行必要的控制器操作。
假设表单正在 POST 的控制器操作看起来像这样 (伪代码,只是一个例子):
[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" });
}
}
如您所见,我 return 一个 Json 对象返回一个 success
属性 和一个 error
(如果需要)。
然后由页面中的回调方法处理,然后显示旋转器和独角兽以及其他魔法。
如果成功,模式将关闭并显示 "success" 消息。
如果不成功并且出现错误 return,则错误 div
会填入我发回的错误消息。听起来很简单?..
场景
假设用户的会话令牌仅持续 15 分钟 - 并且正在滑动(每个新请求都会重置它(不一定对问题至关重要))。他们没有使用 "remember me" 选项。
如果他们在页面上 idle/sitting 的时间超过了分配的时间,则令牌将用完。
显然,此时他们的会话令牌已过期,他们将需要重新登录。
导航到 [Authorize]
控制器操作时会发生通常的行为:使用 ReturnUrl=xyz
查询字符串将用户带回登录页面。
想象一下
所以,回到模态的 Ajax 形式。
用户已在页面上停留 15 分钟,他们的令牌现已过期。
他们单击按钮执行 [Authorize]
d 操作...
Action 方法未执行,WebApp return重定向到登录页面。
但是 通过这个 Ajax 调用 return 的是整个登录页面。看到没有 success
,回调函数接收到重定向,它压缩了登录页面 - 全部变成了这个小 tiny div
.
你不需要我告诉你这看起来很丑陋。
问题
很明显,WebApp实现了[Authorize]
属性,用户已经登出
我无法在 Action 中设置任何断点,因为 [Authorize]
接管并自动重定向。
所以,我想问的是:
如何 bypass/overcome/solve 这个问题 [Authorize]
先被触发而 Action 代码块没有被执行?
我们一如既往地感谢您的建议、回答和一般指导。
您可以删除 [Authorize] 属性,检查控制器方法中的授权 (if (User.Identity.IsAuthenticated)
),如果用户未被授权,return 向客户端发送适当的错误。
你可以创建一个自定义属性,这样你就可以将它们重定向到登录控制器,到你想要的任何东西 do.what 我所做的是 return 它们到我的 accessdenied 操作。当发生 ajax 错误时,通过 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