如何在ASP.NET中实现基于权限的授权?

如何在ASP.NET中实现基于权限的授权?,asp.net,authorization,custom-attributes,Asp.net,Authorization,Custom Attributes,我正在使用ASP.NET应用程序(不使用MVC),需要一个基于用户角色权限的授权scheme,其中页面和/或方法可以要求它们所需的特定权限(而不是用户所具有的角色)。有没有办法扩展表单身份验证(或构建某种东西)来解决这个问题 如果可能,我希望能够使用属性: [RequirePermission("UserEdit")] public partial class EditUser : System.Web.UI.Page { } 甚至对于方法: public class MyClass {

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

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

[RequirePermission("UserEdit")]
public partial class EditUser : System.Web.UI.Page
{
}
甚至对于方法:

public class MyClass
{
    ...
    [RequirePermission("UserEdit")]
    public void Save()
    {
        ...
    }
}
这可能吗

我发现,建议对权限使用角色:

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

我不太喜欢这个解决方案,但这也是解决问题的一种可能方式,但我需要做什么才能让它工作呢

微软的授权模式糟透了……而且得到了广泛认可 )

也就是说。通过将其
IPrincipal.IsInRole
API(从而能够利用
Authorize
属性)融入到它们的
IPrincipal.IsInRole中来实现交叉兼容性是很好的


所以…我要做的是在DB中有一个包含用户、角色和权限的完整权限模型…但是当我的代码设置
CurrentPrincipal
时,我将用户的角色和权限展平到
IPrincipal
的角色集合中。这远非理想……但我认为这是一个体面的妥协。其他人(Rockford Lhotka)也采取了这种方法:

我不确定我是否看到了您正在寻找的内容与
AuthorizeAttribute
已经提供的内容之间的区别。您不喜欢
AuthorizeAttribute
的哪些方面?@qntmfred:基于角色的授权不是基于权限的授权。微软在其IPrincipal模型中将一切简化为基于角色的授权……但这被广泛认为是他们糟糕的设计。理想的模型包括用户、角色和权限。用户处于角色中。角色有一组许可。就像洛基(你也说)……如果你认为ISIROROLE()可以被认为是“HasPixSee()”,那么就有一个解决方案。当您用“角色”列表加载.NET主体时,实际上是用权限列表加载它。因此,当应用程序询问“IsInRole()”时,它是这样做的:
bool result=currentPrincipal.IsInRole(requiredPermission)
您仍然可以使用
AuthorizeAttribute
来精确地执行此操作……但关键点是,您的内部模型应该区分角色和权限,即使IPrincipal API不这样做……这个想法很好。我在构建数据库和找出逻辑方面没有问题,但我对表单身份验证相当陌生,所以我不知道将代码放在哪里。。。你能给我一些提示吗?最好的解决方法是什么?扩展i原则?更改存储过程?(我不知道为什么,但目前我甚至不能使用[Authorize]属性,即使我们正在使用表单身份验证)…我个人有…但这不是必需的。需要的是创建IPrincipal know的代码,以便将您的角色/权限模型扁平化为IPrincipal的角色。