我在web.config中使用无cookie的方式创建了一个新的MVC5网页。我使用ASP身份通过默认模板登录表单登录应用程序。
我的网址如下:
http://localhost:48839/(S(wjz4mdav4ue0osbywkol0zuv))/Home/
我使用Chrome登录。令我惊讶的是,将URL复制到Edge或Firefox并没有登录。我看不到我的用户名,等等。
Request.IsAuthenticated
在Edge和Firefox中是false
。
MVC如何验证用户身份?它使用浏览器的用户代理字符串吗?
我记得几年前(也许是MVC3?)做到了这一点。
编辑: 这是我的web.config中的条目:
<sessionState cookieless="true" />
我还注意到,在Chrome中使用隐身模式具有相同的行为。
答案 0 :(得分:1)
来自MSDN:
ASP.NET会话状态在以下过程中标识来自同一浏览器的请求 在有限的时间范围内进行会话,并提供了一种持久的方法 该会话期间的变量值。
这意味着会话状态对于不同的浏览器将有所不同,并且新会话将获得其自己的SessionId,在您的情况下,该URL是通过URL而不是cookie传递的。
还有另一件事是重新生成过期的sessionId:
默认情况下,将回收无cookie会话中使用的会话ID值。也就是说,如果使用过期的会话ID发出请求,则通过使用随请求提供的SessionID值来启动新会话。当多个浏览器使用包含无cookieSessionID值的链接时,可能会导致会话无意间被共享。 (如果链接是通过搜索引擎,电子邮件或其他程序传递的,则会发生这种情况。)您可以通过将应用程序配置为不回收会话标识符来减少共享会话数据的机会。为此,请将sessionState配置元素的regenerateExpiredSessionId属性设置为true。当使用过期的会话ID进行无cookie会话请求时,这将生成一个新的会话ID。
您可以考虑到不利因素,尝试将regenerateExpiredSessionId
设置为false。