1

我在MVC4(.NET)网站中有单页面应用程序。 某些方法对特定角色具有权限。经过一段时间后,登录用户收到错误“此请求的授权已被拒绝”

当用户登录到系统(带饼干)

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

一切工作正常,但如果用户离开网站开通,一段时间后回来(至少30分钟,我认为)而无需刷新(这是一个单页的应用程序,因此无需刷新),然后尝试做一些网站 - 用户得到一个错误

“授权已被拒绝了这个请求。”

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

我想也许会议结束或类似的东西。我该如何解决它?

在我的web.config我有这行:

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

默认的超时时间为30分钟,它在你的情况属实。您可以增加超时时间或寻找其他解决方案,而不是表单身份验证。将Cookie保留在本地存储和某处。在提出请求的同时(我相信你使用的是客户端ajax),那么你可以追加cookie – qamar 2015-01-21 05:15:23

+0

确实我使用客户端ajax。我怎样才能增加30分钟?你有第二个建议的教程吗? – TamarG 2015-01-21 05:18:49

+0

请参阅答案 – qamar 2015-01-21 05:20:21

回答

1

FormAuthentication超时48小时绰绰有余。

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

你有两个选择 -

  1. 增加SessionState的超时。 仅供参考:如果增加得太大,就会变成安全漏洞。

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

<sessionState timeout="480" /> 

OR

  • 创建在客户端的计数器。如果页面闲置19分钟,则ping服务器。基本上,您需要在sessionState超时之前向服务器发送请求。
  • 例如,创建一个虚拟控制器,这样并通过AJAX调用 -

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

    我该怎么做1和2?你是什​​么意思ping服务器?只是创建和Ajax的 - 什么?以及如何增加会话超时? – TamarG 2015-01-21 05:38:10

    +0

    谢谢!我会尝试两个。关于第二个答案 - 我所要做的就是向服务器发送一个请求,不管是什么?只需连接服务器? – TamarG 2015-01-21 05:56:15

    +1

    是的,只需在会话过期之前通过Ajax向服务器发送虚拟请求即可。然后服务器将延长会话超时。 – Win 2015-01-21 14:52:21

    0

    可以增加网络配置的超时值,在形式的认证部分,你在上面粘贴。

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

    现在它是'超时=“2880”'这是48小时,但是它在48小时过去之前发生了很多,所以我没有看到如何改变认证超时可以帮助。 – TamarG 2015-01-21 05:22:31

    相关问题