Skip to main content
 首页 » 编程设计

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

2024年04月17日42sharpest

介绍

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

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

用户必须登录才能进入这个特定页面并执行此特定操作 - 所以我使用 [Authorize] 属性进行必要的 Controller 操作。

假设表单正在 POST 的 Controller 操作看起来像这样(伪代码,只是一个例子):

[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 对象。

然后由页面中的回调方法处理,然后显示旋转器、 unicorn 和其他魔法。

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

如果不成功并返回错误,错误div 将填充我发回的错误消息。听起来很简单?..


场景

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

如果他们闲置/停留在页面上的时间超过分配的时间,则 token 用完。

显然,此时他们的 session token 已过期,他们将需要重新登录。

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


想象一下

那么,回到模式的 Ajax 表单。

用户已经在页面上停留了 15 分钟,他们的 token 现已过期。

他们点击按钮执行[Authorize]d action...

Action 方法未执行,WebApp 返回一个重定向到登录页面。

但是通过这个 Ajax 调用返回的是整个登录页面。看到没有成功,回调函数接收到重定向,这将登录页面压缩 - 全部到这个小的 tiny div 中。

你不需要我告诉你这看起来很丑陋。


问题

很明显,WebApp实现了[Authorize]属性,用户已经登出。

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

所以,我要问的是:

如何通过先触发 [Authorize] 而未执行 Action 代码块来绕过/克服/解决此问题?

一如既往地感谢您提出的建议、回答和一般指导。

请您参考如下方法:

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