【问题标题】:How to secure a complete WCF service with PrincipalPermission's如何使用 PrincipalPermission 保护完整的 WCF 服务
【发布时间】:2015-03-06 09:53:36
【问题描述】:

我有一个与netTcp 绑定的 WCF 服务,它有 100 多种方法,我想保护基于 Windows 用户组的所有方法。

我知道您可以将属性 [PrincipalPermission(SecurityAction.Demand, Role = "MyWindowsUserGroup")] 放在每个方法之前。

我是否需要为每个方法单独执行此操作,还是有办法让服务中的每个方法默认使用同一用户组进行保护?

【问题讨论】:

    标签: wcf nettcpbinding principalpermission


    【解决方案1】:

    您可以在类级别和方法中添加PrincipalPermission

    // Before:
    public class AdministrationService : IAdminService
    {
       [PrincipalPermission(SecurityAction.Demand, Role = "Domain\Admin Service Admins")]
       public bool DisableAdministrator(int userId)
       {
       }
    
       [PrincipalPermission(SecurityAction.Demand, Role = "Admin Service Admins")]
       public bool DeleteAdministrator(int userId)
       {
       }
    }
    
    // After:
    
    [PrincipalPermission(SecurityAction.Demand, Role = "Admin Service Admins")]
    public class AdministrationService : IAdminService
    {
       public bool DisableAdministrator(int userId)
       {
       }
    
       public bool DeleteAdministrator(int userId)
       {
       }
    }
    

    如果您希望拥有多种类型的权限,您还可以定义它的多个实例。

    [PrincipalPermission(SecurityAction.Demand, Role = "Admin Service Admins")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Domain\Domain Admins")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Domain\Power Users")]
    public class AdministrationService : IAdminService
    {
       public bool DisableAdministrator(int userId)
       {
       }
    
       public bool DeleteAdministrator(int userId)
       {
       }
    }
    

    【讨论】:

    • 嗨,多米尼克,谢谢,看起来不错。
    • 我不知道这是否从未奏效,或者自 2015 年以来 WCF 是否发生了变化,但 PrincipalPermissionAttribute 只能在方法级别添加。这是根据我自己的观察和How to: Restrict Access with the PrincipalPermissionAttribute Class:“如果您将 PrincipalPermissionAttribute 属性应用于合约,则会引发 SecurityException。您只能在方法级别应用该属性。”
    • @Pat:如果你把它应用到接口(合约)上,可能就是这样。上面的示例将其应用于具体类。此外,我检查了 MS Docs 上的定义,通过 AttributeUsage.Class 分配将其应用于类是有效的。 (docs.microsoft.com/en-us/dotnet/api/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多