C# 为什么我要在控制器属性中硬编码用户权限?
我见过这样的示例代码,看起来非常合理:C# 为什么我要在控制器属性中硬编码用户权限?,c#,asp.net-mvc,security,role-based,C#,Asp.net Mvc,Security,Role Based,我见过这样的示例代码,看起来非常合理: [Authorize(Roles = "Admin, User")] public class SomeController : Controller 但我也看到了几个类似的例子: [Authorize(Users = "Charles, Linus")] public class SomeController : Controller 我为什么要这么做?我无法想象在任何情况下,我都想构建一个提前知道用户名的系统。你不会,硬编码用户是一种坏味道
[Authorize(Roles = "Admin, User")]
public class SomeController : Controller
但我也看到了几个类似的例子:
[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller
我为什么要这么做?我无法想象在任何情况下,我都想构建一个提前知道用户名的系统。你不会,硬编码用户是一种坏味道。角色存在于类似的事情中
编辑:我相信,就像.net 1.0在整个web.config中使用允许/拒绝权限一样,这些权限(或至少应该只)被用作示例酱,即使我是一堆相信博客、教程和示例只应该使用良好实践的人。唯一“合法”的我认为这样做的原因是建立一个后门——要么是为了邪恶,要么是为了“未来维护”的目的。后者是不好的jujuju,因为它引入了安全风险。前者当然也是不好的jujuju:)这有一些合法的用途,这里有一个例子:如果你正在构建一个非常简单的站点,它只有一个管理员帐户和一个未经验证的帐户,你可以这样做
[Authorize(Users = "Admin")]
这就省去了只为一个用户构造角色的麻烦。想想UNIX风格,根帐户(uid 0)是特殊的,而不是特定的组
另一个例子是一个简单的一次性应用程序,您正在测试一些东西。如果您只是想测试您的身份验证页面或类似的东西,那么就没有理由为角色而烦恼
还有一个原因:测试。您可以仅为身份验证构建单元测试,而不需要对基于角色的框架进行单元测试。(记住,不是每个人都使用默认的成员资格提供程序,而一些成员资格提供者是相当复杂的)。通过为测试用户创建硬编码的身份验证,可以绕过角色框架。 您可能会考虑这样做的两个原因:
在任何情况下,它归结为糟糕的设计,你不会想这样做。但是界面是存在的,因为它是最简单的控制级别。我同意David Pfeffer的观点 此外,我认为您可以在应用程序中定义一组具有特定权限和作业的用户-可能是出于测试目的,可能是性能跟踪。。。当需求敲门时,你就会知道这一点;)-
只是一个不应包含在应用程序使用的有效用户集中的组。:)-核心方式-如果你是Linus或Charles,你可能想这样做。同意,但你不能只做
Role=“Admin”
?@Robert Harvey:不,因为这样任何管理员帐户都可以访问该功能。在他的示例中,只有管理员帐户可以访问它。这就是为什么我要把它比作根。例如,在大多数UNIX系统(使用PAM身份验证系统的系统除外)上,uid=0的根帐户对所有内容都具有特殊权限。其他管理员,即控制盘组的成员,可以sudo
(作为超级用户)或su
(成为超级用户),在有限的时间内将他们转换为uid=0帐户(用于命令或直到他们退出shell)。但是用户本身是特殊的,而不是wheel(admin)组中的成员。