2010-01-18 35 views
7

我正在一个网站(用C#开发的ASP.NET)上工作,这个网站已经传递给我了。当我通过该网站的工作,我发现很多网站都有这种类型的代码在它:隐藏控件作为网络安全形式,建议更好?

EmailLabel.Visible = false; 
WhateverButton.Visible = false; 
AnotherControl.Visible = false; 
... 

这一切通常在网站的后台代码完成(在Page_Load方法)。本质上,这是为了防止未登录的用户访问组件(该网站的规则是,未登录的用户在登录前应该无法看到网站的任何部分)。 以上的方式工作 ...但必须始终检查用户是否已登录,然后转到所有这些组件的正确状态,这似乎相当昂贵。

是否有不同的方式,这个问题可能会接近。仅仅从思考/研究的角度来看,我想也许有一种方法可以在用户未登录的情况下重定向回主页。甚至进一步,我可以扩展一个基本页面,以便为任何用户页面扩展了基本页面。但是,我在这方面的知识是有限的,所以我的建议可能无效。

什么能如此建议?有什么更好的?有什么好的吗?

回答

2

我们在工作中做了很多工作。

我们完成此任务的方式是创建一个从System.Web.UI.Page继承的BasePage类。然后你重写OnInit,调用base.OnInit,并添加代码来检查登录用户。如果用户未登录,请将其重定向到登录页面(不会从BasePage继承)。

然后,在需要保护的每个页面上,只需将页面更改为从BasePage继承。

与上面说的womp相反,如果你写了Response.End();重定向后,即使继续处理页面的其余部分,速度也会更快!

希望有所帮助。

+0

尽管这种方法在大多数情况下都是绝对推荐的,但它不可能更快。如何设置一些布尔变量在接近发送301往返浏览器的开销的任何地方?你正在谈论纳秒的处理器时间与数百毫秒的网络延迟以及处理多个浏览器请求的服务器。并且Response.End()抛出一个ThreadAbortException异常,这会产生它自己的开销。 – womp 2010-01-18 17:57:13

+0

只是为了澄清 - 保护需要*唯一*认证访问的页面绝对应该以这种方式完成。我不清楚OP是否需要这个或不。 – womp 2010-01-18 17:58:49

+1

之所以这样更快,是因为OnInit之后的页面循环方法都没有以这种方式调用。节省大量的CPU时间。对于所有意图和目的,如果用户未登录,则预期会有额外的往返时间和与其相关的时间。 – TJMonk15 2010-01-18 18:34:09

1

这将是幅度发出重定向,而不是将可见的标志上的一些控制更贵的多,很多订单。

如果您的页面允许匿名访问和登录访问,那么重定向也会要求您以其他方式允许匿名访问,可能是通过构建第二个版本的页面。

费用问题实际上只是一个旁观,它可能根本无关紧要。要回答你的主要问题,不知道更多关于你的应用程序的架构,我会认为这两件事情都是不可取的。将控件设置为Visible = false的优点是没有任何东西会呈现给不可见控件的输出流,但它们仍然可以与服务器请求进行交互。

不知道更多关于你的页面的要求,很难提出其他建议。正如其他人所提到的,如果隐形控件根本不参与匿名用户,那么LoginView可能会满足您的需求。

+0

好的答案(+1),但我很好奇为什么重定向是“更贵的几个数量级”。特别是因为,无论如何,一个未登录的用户几乎不可能“爆发”主页(除非他们记住地址到随机页面)。所以,这不应该是经常发生的事情。 – JasCav 2010-01-18 17:46:50

+0

考虑设置一些可见标志需要几个处理器周期,而生成重定向需要往返浏览器,所有网络延迟,服务器资源处理新请求以及完成页面生命周期的处理。 – womp 2010-01-18 17:53:21