PrincipalPermission和Authorize属性有何区别?

10

有人能解释一下这两个属性的区别和使用场景吗?我很困惑因为它们的行为很相似。

我知道 [Authorize] 钩入了 ASP.NET 应用程序生命周期,并在请求到达 Controller/Action 之前运行。PrincipalPermission 呢?

[PrincipalPermission(SecurityAction.Demand, Role="Admin")]

[Authorize(Roles="Admin")]
1个回答

10

Authorize 属性用于指定控制器或操作方法的访问限制。换句话说,您可以授予或拒绝用户/角色访问站点内的单个页面或URL的权限。

当您在ASP.NET应用程序中对用户进行身份验证时,经过身份验证的用户标识将自动流传到该用户在服务器上的请求中。

您可以通过 PrincipalPermission 属性在业务类中使用此标识信息。借助 PrincipalPermission,您可以授权用户的能力。例如,您可以防止用户实例化类或访问业务类上的方法。

这使得向业务和数据层添加干净的安全授权规则变得容易。

using System;
using System.Security.Permissions;

[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public class EmployeeManager
{
    [PrincipalPermission(SecurityAction.Demand, Role = "Manager")]
    public Employee LookupEmployee(int employeeID)
    {
       // todo
    }

    [PrincipalPermission(SecurityAction.Demand, Role = "HR")]
    public void AddEmployee(Employee e)
    {
       // todo
    }
}
例如,通过使用PrincipalPermission属性,
  • EmployeeManager类只能由经过授权的用户实例化。
  • LookupEmployee方法只能被具有Manager角色的用户访问。

参考资料

向业务和数据层添加授权规则

ASP.NET 2.0安全最佳实践


1
你是说 PrinciplePermission 属性可以在控制器/操作方法之外使用,但 Authorize 属性不能? - EF0
此外,PrinciplePermission 属性似乎可以让您有能力主动拒绝特定角色的访问(也许我们的方法应该接受所有具有“员工”角色的用户访问,除了那些还具有“临时”角色的用户)。 - EF0
@EFO 是的,根据 MSDN 的说法,您只能在控制器或操作方法上使用Authorize属性。 - emre nevayeshirazi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接