【问题标题】:Session ID in URL with mode set to "SQLServer"URL 中的会话 ID,模式设置为“SQLServer”
【发布时间】:2012-12-09 16:14:51
【问题描述】:

我正在开发一个使用 Webmatrix 进行身份验证的 ASP.Net MVC 4 应用程序。我的 web.config 文件中有以下内容

<sessionState mode="SQLServer" cookieless="true" allowCustomSqlDatabase="true"
     sqlConnectionString="Data Source=server;Initial Catalog=ASPState;Persist
                          Security Info=True;User ID=user;Password=password" 
     timeout="2880" sqlCommandTimeout="10" />

我可以看到正在填充 ASPState 数据库,但我仍然在 URL 中获取会话 ID。当我尝试通过 Chrome 访问它时,它会错误地指出许多重定向。当我通过 IE 访问它时,即使我看到它重定向(尽管会话 ID 在 url 中),它仍然有效,但是当我尝试登录时出现以下错误:

无法序列化会话状态。在“StateServer”和“SQLServer”模式下, ASP.NET 将序列化会话状态对象, 结果是不可序列化的对象或 MarshalByRef 对象 不允许。如果类似的序列化,同样的限制适用 由自定义会话状态存储在“自定义”模式下完成。

我没有对 Webmatrix 进行任何自定义,这都是默认设置。我需要会话 ID 远离 URL 并使用数据库,就像我在 web.config 文件中设置的那样

【问题讨论】:

  • 此消息告诉您,您尝试添加无法序列化的会话类 - 例如 Dictionary 无法保存在会话中,或者您可能没有的其他具有类的列表使用 [Serialization] 关键字。

标签: asp.net asp.net-mvc asp.net-mvc-4 forms-authentication session-state


【解决方案1】:

首先,尝试将 cookieless 设置为 false。其次,使用 ASPState 时,allowCustomSqlDatabase 应设置为 false,第三,不要在连接字符串中指定 Initial Catalog。 SQLState 将在后台自动执行此操作。第四,我不知道您要序列化的是什么,但您应该将 [Serializable] 属性放在您尝试存储在会话中的类上方。

对于 URL 字符串中的会话 ID,您使用的是 IIS 还是 IIS Express? IIS 使用一个小实用程序aspnet_filter.exe 来接受带有会话ID 的URL,并在内部将您重定向到正确的地址。当它向您返回信息时也是如此。 URL 再次经过修饰过程。但是,我不确定 IIS Express 是否使用该实用程序。在某种程度上,在开发人员机器上关闭 cookie 并没有太大意义。

【讨论】:

  • +1 用于深入了解 aspnet_filter.exe。我在寻找 IIS 是否将每个带有会话 ID 的 url 视为不同的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多