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)组中的成员。