MVC会话可能未保存.可能将内容转储到页面

本文关键字:转储 会话 保存 MVC | 更新日期: 2023-09-27 18:28:22

当我尝试进行安全保护时,我的MVC站点出现了问题,我从AD获得了一个组列表,将它们与用户进行比较,然后尝试创建一个自定义安全对象,然后将其保存到Session

该CCD_ 2用于确定用户是否可以查看页面。它在我的本地开发环境中运行良好,但在我的测试系统(单独的框)中不起作用,并且我会被拒绝访问(如预期的那样,如果用户不是特定组的成员)。

代码没有抛出任何错误,但当我尝试检索SECURITY_ACCESS对象的会话时,它似乎找不到任何内容。

为了检查会话是否临时有效填充,我是否可以将会话的全部内容转储到一个页面?

在我的AccessDenied控制器的View中,我得到了以下内容,但虽然它说会话中有一个对象,但它实际上并没有输出它

@foreach (string item in Session.Keys)
{
<tr>
<td>
<strong>Session: </strong>@Html.DisplayFor(m => item))
</td>
</tr>
}

我开始解决这个问题,因为我不明白为什么它在测试中不起作用。

MVC会话可能未保存.可能将内容转储到页面

我强烈建议您不要将安全组件放在会话中。我还鼓励您不要推出自己的授权系统。相反,使用MVC中内置的安全组件。组件概述如下:http://www.asp.net/mvc/overview/security.内置的AuthorizeAttribute可以与Windows Auth一起使用,以指定应该访问页面的AD组,如下所述:http://msdn.microsoft.com/en-us/library/gg703322(v=vs.98).aspx.

回答您的问题:

HttpSessionState很难使用;我希望它能实现IDictionary<string,object>。无论如何,这里有一种将会话转储到页面的详细方法。

@{
    var sessionItems = Session.Keys.OfType<string>().ToDictionary (k => k, k => session[k]);    
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(sessionItems, Newtonsoft.Json.Formatting.Indented);
}
<pre>
    @Html.Raw(json);
</pre>