2010-02-16 58 views
7

我见过的示例代码看起来像这样,这似乎是完全合理的:为什么我硬编码我的控制器属性中的用户权限?

[Authorize(Roles = "Admin, User")] 
public class SomeController : Controller 

但我也看到了几个例子看起来像这样:

[Authorize(Users = "Charles, Linus")] 
public class SomeController : Controller 

为什么我会永远想这样做这个?我无法想象任何我想要建立一个知道其用户名的系统的场景。

+7

如果你是Linus或Charles,你可能会这样做。 – 2010-02-16 15:27:52

回答

3

这有几个合法的用途,这里有一个例子:如果你正在建立一个非常简单的网站,它只是一个管理员帐户和未经身份验证的帐户,你可以做

[Authorize(Users = "Admin")] 

这可以节省您的麻烦,只为单个用户构造角色的麻烦。认为UNIX风格,其中根帐户(uid 0)是特殊的而不是特定的组。

另一个例子是简单的丢弃应用程序,在这里你正在测试一些东西。如果你只是想测试你的认证页面或类​​似的东西,没有理由打扰角色。

还有一个原因:测试。您可以为您的身份验证构建单元测试,而无需单元测试基于角色的框架。 (请记住,不是每个人都使用默认的成员资格提供程序,并且某些成员资格提供程序非常复杂。)通过为测试用户创建硬编码身份验证,您可以绕过角色框架。

+0

同意,但你不能只是'Role =“Admin”'? – 2010-02-16 15:31:50

+0

@Robert Harvey:没有,因为任何管理员帐户都可以访问该功能。在他的例子中,只有管理员帐户可以访问它。 – 2010-02-16 15:36:53

+0

没错。这就是为什么我要把这个比喻说成根。例如,在大多数UNIX系统(使用PAM认证系统的系统除外)中,uid = 0的root帐户对所有内容都具有特殊权限。其他管理员,即车轮组的成员,被允许在有限的时间内“sudo”(作为超级用户)或者“su”(成为超级用户)将其转换成uid = 0帐户(无论是对于命令还是直到他们退出他们的外壳)。但用户本身是特殊的,而不是轮子(admin)组中的成员。 – 2010-02-16 15:48:25

1

你不会,硬编码的用户是一种难闻的气味。这样的事情存在角色。

编辑:我相信,就像.net 1.0用整个web.config命中允许/拒绝权限一样,那些(或至少应该只是)用作示例酱,即使我进入了一堆的人相信博客,教程和样本应该只使用良好的做法。

1

我唯一能想到的“合法”理由是建立一个后门 - 无论是为了邪恶还是为了“未来维护”的目的。后者是Bad Juju,因为它引入了安全风险。前者是坏Juju当然:) :)

0

一对夫妇的你可能会考虑这样做的原因:

  1. 的应用预计将有 很短的生命周期,并没有 维护是必需的。
  2. 用户(一个或多个) 在问题可能不属于一个 充分定义的组(如在 一个小企业的情况下),和 没有预期的变化。 (还是很糟糕的设计,但它 不会是闻所未闻的)
  3. 您可能有 几个重载在需要的 组内个人的不同 行为小 应用。

在任何情况下,它归结为糟糕的设计,你不想这样做。但接口在那里,因为它是最简单的控制级别。

0

我同意David Pfeffer。另外,我认为你可以在你的应用程序中定义一组具有非常特定权限和作业的用户 - 可能是测试目的,或许是性能跟踪......当需求敲门时你会知道它; ) - 。

只是一个不应包含在您的应用程序所使用的有效用户集合中的组。 :) - 硬核方式 -

相关问题