【问题标题】:MVC Session Possibly Not Saving. Possibly Dump Contents To Page?MVC 会话可能未保存。可能将内容转储到页面?
【发布时间】:2013-08-20 19:24:32
【问题描述】:

当我尝试进行安全操作时,我的 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>
}

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

【问题讨论】:

    标签: c# asp.net-mvc session asp.net-mvc-4 razor


    【解决方案1】:

    我强烈建议您不要将安全组件放在会话中。我还鼓励您不要推出自己的授权系统。相反,请使用 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&lt;string,object&gt;。无论如何,这是一种将会话转储到页面的有点冗长的方法。

    @{
        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>
    

    【讨论】:

    • 后端数据库的开发方式(我无法控制)我必须真正创建自己的安全对象。另外,我有几个不同的组最终将被授予应用程序的完全写入、部分写入和只读权限。使用 Authorize 属性之类的东西不会让这变得困难吗?目前,我坚持让这个初始安全功能正常工作,但一旦我发布测试,我可以重构它以潜在地使用授权角色。
    • 我刚刚通读了那些东西,实际上我很喜欢它。我唯一知道的是我不希望弹出一个对话框询问登录凭据,我宁愿它重定向到 AccessDenied 页面。这可能吗?提供给 MSDN 的链接还需要更改 IIS 中的功能,而我无法做到这一点。这是限制吗?如果是这样,我仍然必须使用我原来的方法。
    • @MattR,对于 Windows Auth,弹出凭据质询是对 NTLM 协商的依赖于浏览器的响应;根据我的经验,IE 只会使用您登录 Windows 时使用的凭据,但其他浏览器会使用该弹出窗口。您可以从 AuthorizeAttribute 派生一个类并强制重定向而不是质询,但这可能会阻止您使用 Windows Auth。
    • @MattR,AuthorizeAttribute 可以应用于类和方法,因此您可以对 POST 和 GET 方法有不同的限制。如果这变得太复杂了,您可以查看 FluentSecurity (fluentsecurity.net/getting-started),它为您提供了一个单一的授权配置点。如果您的Security 对象足够简单,请考虑将其嵌入用户的身份令牌而不是会话中,这样它将被加密并且不会被序列化到会话存储中。更好的是切换到基于声明的身份验证...
    • 不幸的是,我不能使用任何第 3 方 DLL / API。我非常受限于我在 Visual Studio 中“开箱即用”的内容。使用AuthorizeAttribute 的任何提示或示例就像您在第二条评论中简要描述的那样?我肯定需要做一个重定向,因为我不能限制使用的浏览器。这是针对内部应用程序的,因此用户将拥有多个浏览器并且只想直接登录/被踢出。我认为我没有时间在这个阶段尝试并完全实施Authorize 的想法。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2013-09-12
    相关资源
    最近更新 更多