Logged-in 用户在一段时间后收到错误 "Authorization has been denied for this request"

Logged-in user gets an error "Authorization has been denied for this request" after a while

我在 MVC4 (.NET) 网站上有一个 single-page-application。 一些方法具有特定角色的权限。

当用户登录系统时(使用 cookie)

 FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

一切正常,但如果用户让网站保持打开状态并在一段时间后返回(我认为至少 30 分钟)没有刷新(这是一个单页应用程序,所以不需要刷新)然后尝试在网站上做一些事情 - 用户收到错误

"Authorization has been denied for this request."

刷新后 (F5) - 一切恢复正常。

我想也许 session 已经结束或类似的事情。我该如何解决?

在我的 web.config 中有这些行:

  <authentication mode="Forms">
      <forms loginUrl="~/" timeout="2880"  slidingExpiration="true" cookieless="UseCookies" />
    </authentication>

您可以在 Web 配置中增加超时值,在上面粘贴的表单身份验证部分。

 <authentication mode="Forms">
  <forms loginUrl="~/" timeout="50000000"  slidingExpiration="true" cookieless="UseCookies" />
</authentication>

您的 FormAuthentication 超时 48 小时绰绰有余。

问题是SessionState超时;默认情况下,它会在 20 分钟后过期。

你有两个选择-

  1. 增加 SessionState 超时。 仅供参考:如果你增加太多,它会成为安全漏洞。

例如,在web.config(480=8小时)中添加sessionState标签。

<sessionState timeout="480" />

  1. 在客户端创建一个计数器。如果页面空闲 19 分钟,请 ping 到服务器。基本上,您需要在 sessionState 超时之前向服务器发出请求。

例如,像这样创建一个虚拟控制器并通过 ajax -

调用
public partial class PingController : Controller
{
    public ActionResult Index()
    {
        return Content("Ping!");
    }
}