ASP.NET MVC - 管理区域还是单独的Web应用程序?

12

迄今为止,我一直在使用 MVC Area 来处理 mvc 应用程序的 管理 部分,但是最近我因为一个事实而重新考虑这个问题:每个应用程序只能有一个表单身份验证配置。

这成为了一个问题,因为在最近的项目中,我想为用户设置不过期的授权 cookie,但我不希望管理员用户也享受到这个设置。我也不希望用户登录页面可用于访问管理员工具。

我正在考虑在解决方案中为管理工具单独设置一个 MVC 项目。这对我来说似乎是最好的选择,但我想知道部署方面是否会有复杂性。 (目前我正在使用 VS2008 中的 Web 部署项目来管理构建)。

现在有人为管理部分使用单独的 MVC 项目吗?有什么需要注意的地方吗?还有其他意见,认为这不是一个好主意的原因吗?

谢谢。

4个回答

8
我总是使用单独的网站进行管理。但这主要因为我的网站管理完全不同于使用,因此需要不同的布局。
另一个好处是你不必担心用户可能会修改他们不应该修改的东西,因为这些部分没有内置到用户网站中。
更新
我的意思是使用Razor或Masterpage与Webforms视图引擎一起的布局。
我们使用http://admin.domainname.comhttp://www.domainname.com 来分离网站。非常容易设置。
分离网站还使控制器和视图变得更加清晰,因为它们只处理管理员或用户的任务。如果像我一样是个懒惰的编码人员,就不需要很多 if 语句了。

谢谢。你使用的是哪个平台?你所说的布局是指页面布局/设计吗? - UpTheCreek
2
我们只是使用不同的母版页 - 完全不同的布局。这样,用户就不必设置两个站点,并设置两个不同的端口(或主机名)等。 - Michael Shimmins
我正在使用Spark视图引擎的MVC3。 - jgauffin
同意@Michael Shimmins的观点 - 不同的布局/内容不是使用单独的网站的理由。这就是母版页的作用。您可以在返回视图时编程指定母版页:return View("Index", model, "AdminMaster") - RPM1984
我提出了比布局/母版更多的原因。 - jgauffin
我更喜欢使用独立的MVC应用程序而不是区域。它们仍然可以共享需要共同使用的资源,但是每个应用程序都代表一个非常具体的关注点(而不是一个做所有事情的大型应用程序),在我工作的构建环境中实际上更容易管理。 - Fenton

2

表单授权cookie可以针对管理员区域进行路径限制,但这将在处理身份验证时带来一些麻烦,但可能是可行的。

除了使用admin.hostname.com或类似的内容之外,另一个选项是在/admin上使用子应用程序,但这并不一定解决您的问题。

我们将Web应用程序开发为两个不同的站点,主要是因为我们希望将管理与实际站点分开,并且出于可扩展性的考虑。我们希望能够扩展有关的实际网站,而不是管理部分。

我们遇到了以下问题:

  1. 内容预览需要某些逻辑,这将需要您在某种配置中存储站点的实际主机名,以便将管理员重定向到正确的站点,并处理一些安全令牌等,因为用户可能未经过身份验证。如果您在同一站点上(相对路径和相同的身份验证),这将更容易。
  2. 可以同时在多个Web服务器上运行的站点(即Web farm)需要考虑到这一点。它涉及缓存失效、配置重新加载或任何其他可能在管理界面中“修改”的应用程序存储数据。然而,这是任何方法都存在的问题。但是,如果您的网站依赖于在Web应用程序中直接进行的任何计划工作或第三方集成,则如果您的管理站点/系统在多个服务器上运行,可能会导致某些问题。因此,将管理系统运行在HA IIS故障转移集群上可能更合适,但是将实际网站(容易受到高负载影响)运行在负载均衡的Web farm上。这种设置的分离有利于分开的站点。

我认为出于可扩展性的原因,您应该考虑将关注点分开,但这完全取决于应用程序的设计是否可能。我们正在为某种类型的网站构建框架,这意味着设计的实际实现因每个客户而异,但我们希望以标准化的方式管理站点,因此这对我们来说是逻辑选择。


1

FormsAuthentication.SetAuthCookie 方法允许您控制它是否跨会话持久化。

如果他们是管理员,则将其设置为 false,否则设置为 true

有关更多信息,请参见 http://msdn.microsoft.com/en-us/library/twk5762b.aspx(第二个参数 createPersistentCookie 控制此操作)。

对于不同类别用户的不同登录页面,如果他们是错误类别的用户并且正在访问错误的登录页面,则可以从身份验证方法返回 false。

所有这些逻辑都应在设置身份验证令牌之前发生。


但是,当用户尝试访问管理员页面时,我希望将他们重定向到与主用户登录页面不同的登录区域。据我所知,使用表单身份验证无法实现这一点。 - UpTheCreek
我们做了相同的事情。我们检查会话变量是否存在。如果不存在,我们将重定向到管理员页面(需要输入密码)。一旦他们成功验证,我们将设置会话变量以表示“是的,他们具有管理员权限”。当浏览器关闭或用户选择通过单击取消管理员权限的链接时,管理员权限将丢失。 - Michael Shimmins

1

出于多种原因,我更愿意将管理站点与其他站点分开:

  • 潜在的安全风险大大降低,因为可以更容易地限制和控制对敏感区域的访问。
  • 在一个良好的解决方案中,各层之间(服务/数据等)的关注点分离意味着相对简单地连接您的管理站点以访问主站点上可用的功能。
  • 开发人员往往不太关心他们的管理站点,因为公司通常专注于前端站点。这意味着影响管理站点的粗心错误不太可能影响主站点。
  • 我使用带有AuthorizeAttribute的基础控制器,这意味着所有操作(除了login!)都无法被没有适当凭据的外部用户访问。然后根据需要覆盖各个操作的相关凭据,但通常采用“设置并忘记”的方法。虽然在单站点方法中可以有两个基础控制器,但我认为它会稍微难以管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接