【问题标题】:Migrating authorization logic from ASP.NET Webforms to ASP.NET MVC3将授权逻辑从 ASP.NET Webforms 迁移到 ASP.NET MVC3
【发布时间】:2025-12-13 15:00:02
【问题描述】:

我开始将 ASP.NET Webforms 应用程序迁移到 ASP.NET MVC 3。该应用程序有一个可供所有用户(也包括匿名用户)访问的公共区域和几个只有经过身份验证的用户才能访问的区域担任特定角色。

WebForms 项目的组织方式如下:

Root folder -> contains all public pages
 |
 --- Private subfolder -> contains a few pages for ALL authenticated users
      |
      --- Customers subfolder -> contains pages for users in role "Customer"
      --- Suppliers subfolder -> contains pages for users in role "Supplier"
      --- Internals subfolder -> contains pages for users in role "Internal"
           |
           --- Admins subfolder -> contains pages for users in role "Admin"
      etc.

目前授权由不同子文件夹中的web.config 文件管理。例如Customers 子文件夹包含以下web.config

<configuration>
    <system.web>
        <authorization>
            <allow roles="Customer" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

在 ASP.NET Webforms 中不再需要配置。此授权适用于Customers 子文件夹中的所有页面。

将此结构迁移到 ASP.NET MVC 3 的最佳方法是什么?或者更具体地说:

  • 具有授权设置的此类web.config 文件是否仍可在 MVC 中以文件夹为基础工作?
  • 如果没有,是否有其他方法可以将授权要求应用于文件夹中的所有页面?
  • 我仍然可以将各个区域组织在单独的文件夹中,尤其是我可以将单个ControllersViewsModels 子文件夹放在每个文件夹CustomersSuppliers 等下以保留所有逻辑和标记紧密结合?

感谢您的反馈!

【问题讨论】:

标签: asp.net asp.net-mvc asp.net-mvc-3


【解决方案1】:

这种带有授权设置的 web.config 文件是否仍然在 MVC 中基于文件夹工作

它们可以但不应该被使用。

如果没有,是否有其他方法可以将授权要求应用于文件夹中的所有页面?

在 ASP.NET MVC 中没有文件夹的概念。有控制器、模型和视图。还有areas。因此,您可以创建一个客户区域并拥有一个基础控制器,该区域中的所有控制器都来自该控制器。然后,您将使用 [Authorize] 属性装饰此基本控制器。这样,所有派生的控制器和操作都需要用户获得授权才能访问它们。您不需要使用区域来实现此目的。您仍然可以在使用此属性装饰的主区域中拥有一个基本控制器,并拥有所有需要身份验证才能派生的控制器。

这里有一个blog post,你可以看看关于 ASP.NET MVC 中的授权。

【讨论】:

  • 如果需要更具体的行为,您还可以创建自己的自定义 Authorize 属性。
  • 谢谢!我将走“区域”路线并手动将[Authorize] 属性应用于每个控制器。对于我的应用程序的大小来说,这很简单且足够好。
  • 在 WebForms 中,我们根据授权逻辑将站点结构划分为文件夹,因为它变得易于配置。但是在MVC中你有很多方法来解决授权安全问题,你应该在逻辑上进行划分。如果没有特定角色的授权用户只有几个页面 - 最好创建特殊控制器而不是区域和基础控制器。如果某些操作应该可用于 1 个以上的角色 - 您可以在 1 个控制器中合并页面。不要使用一堆具有角色属性和区域的基础控制器作为黄金悍马。想想 [Authorize] 的更详细用法
【解决方案2】:

唯一支持保护您的 MVC 应用程序的方法是将 [Authorize] 属性应用于每个控制器和操作方法。

这里是link Microsoft Rick Anderson 的博客Securing your ASP.NET MVC 3 Application

【讨论】:

  • 谢谢,这是一篇非常有用的博文!
最近更新 更多