当我尝试执行安全操作时,我的MVC网站出现问题,我从AD获取了一个组列表,将它们与用户进行比较,然后尝试创建一个自定义安全对象,然后我保存到Session
。
然后,此Session
用于确定用户是否可以查看页面。它在我的本地开发环境中工作正常,但在我的测试系统(单独的框)中它不起作用,我得到拒绝访问(如果用户不是特定组的成员,则按预期方式)。
代码不会抛出任何错误,但是当我尝试检索我的SECURITY_ACCESS
对象的会话时,它似乎找不到任何错误。
为了检查会话是否是临时填充的,我是否可以将会话的全部内容转储到页面?
在我的View
中,对于AccessDenied控制器,我得到了以下内容,但是虽然它说会话中有一个对象但实际上并没有输出它。
@foreach (string item in Session.Keys)
{
<tr>
<td>
<strong>Session: </strong>@Html.DisplayFor(m => item))
</td>
</tr>
}
我开始用这个问题解决问题,因为我无法理解为什么它不能在Test中工作。
答案 0 :(得分:0)
我强烈建议您不要将安全组件放在会话中。我还鼓励你不要推出自己的授权系统。相反,使用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>