2016-08-24 124 views
4

任何人都可以向我解释这两个属性的区别和用例吗?我很困惑,因为他们的行为相似。PrincipalPermission vs授权属性?

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

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

而且

[Authorize(Roles="Admin")] 

回答

5

Authorize属性用于specifiy访问限制给控制器或操作方法。换句话说,您可以授予或拒绝用户/角色访问权限,以访问网站中的单个页面或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角色的用户访问。

参考

Adding Authorization Rules to Business and Data Layers

ASP.NET 2.0 Security Best Practices

+1

你是说的PrinciplePermission属性可以控制器/操作方法外使用,但授权属性不能? – EF0

+0

另外,PrinciplePermission属性似乎让你能够像积极地拒绝某个特定角色一样(也许我们的方法应该接受所有角色为'Employee'的用户的访问,除了那些角色为'Temporary'的角色除外)。 – EF0

+0

@EFO是的,根据MSDN,您只能使用控制器或操作方法上的授权属性。 –