【问题标题】:How can I implement permission-based authorization in ASP.NET?如何在 ASP.NET 中实现基于权限的授权?
【发布时间】:2011-08-31 14:30:52
【问题描述】:

我正在使用一个 ASP.NET 应用程序(不使用 MVC)并且需要一个基于用户角色权限的授权方案,其中页面和/或方法可以要求他们需要的特定权限(而不是用户的角色拥有)。有没有办法扩展表单身份验证(或构建一些东西)来解决这个问题?

如果可能的话,我希望能够使用属性:

[RequirePermission("UserEdit")]
public partial class EditUser : System.Web.UI.Page
{
}

甚至对于方法来说:

public class MyClass
{
    ...
    [RequirePermission("UserEdit")]
    public void Save()
    {
        ...
    }
}

这可能吗?

我找到了this page,它建议使用角色来获取权限:

[Authorize(Roles = "UserEdit")]
public partial class EditUser : System.Web.UI.Page
{
}

我不是非常喜欢这个解决方案,但这也是解决问题的一种可能方法,但我需要做什么才能让它发挥作用?

【问题讨论】:

  • 我不确定我是否看到您正在寻找的内容与 AuthorizeAttribute 已经提供的内容之间的区别。你不喜欢AuthorizeAttribute的什么地方?
  • @qntmfred:基于角色的授权不是基于权限的授权。 Microsoft 在其 IPrincipal 模型中将所有内容都简化为基于角色的授权……但这被广泛认为是其糟糕的设计。理想的模型包括用户、角色和权限。用户在角色中。角色具有一组权限。
  • 就像 Rocky(你也一样)说的......如果你认为 IsInRole() 可以被认为是“HasPermission()”,那么就有一个解决方案。当您使用“角色”列表加载 .NET 主体时,实际上是使用权限列表加载它。因此,当您的应用程序询问“IsInRole()”时,它会这样做:bool result = currentPrincipal.IsInRole(requiredPermission); 您仍然可以使用AuthorizeAttribute 来完成这项工作
  • 没错...但关键是您的内部模型应该区分角色和权限,即使 IPrincipal API 没有...
  • 这个主意不错。我在构建数据库和弄清楚逻辑方面没有问题,但是我对 Forms 身份验证相当陌生,所以我不知道 在哪里 放置我的代码...你能给我一些提示吗那里?

标签: asp.net authorization custom-attributes


【解决方案1】:

微软的授权模式很烂……而且广受认可 http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/)。

就是这么说的。通过融入他们的IPrincipal.IsInRole API(从而能够利用Authorize 属性)实现交叉兼容性非常好

所以...我要妥协的是在数据库中拥有一个完整的权限模型,其中包含用户、角色和权限...但是当我的代码设置 CurrentPrincipal 时,我将用户的角色和权限扁平化为角色IPrincipal 的集合。这远非理想……但恕我直言,这是一个不错的妥协。其他人(Rockford Lhotka)也采用了这种方法:http://www.lhotka.net/weblog/PermissionbasedAuthorizationVsRolebasedAuthorization.aspx

【讨论】:

  • 最好的解决方法是什么?扩展 IPrincipal?更改存储过程? (我不知道为什么,但目前我什至不能使用 [Authorize] 属性,即使我们正在使用表单身份验证)...
  • 我个人是这样做的……但这不是必需的。必要的是您创建 IPrincipal 的代码知道将您的角色/权限模型扁平化为 IPrincipal 的角色。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2010-11-12
  • 2022-12-11
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多