如何:使用 PrincipalPermissionAttribute 类限制访问

控制对 Windows 域计算机上的资源的访问是一项基本的安全任务。 例如,应该只有某些用户才能查看敏感数据,例如工资单信息。 本主题解释如何通过要求用户属于某个预定义组来限制对方法的访问。 有关工作示例,请参阅授权访问服务操作

此任务由两个单独的过程组成。 第一个过程创建组,并用用户填充它。 第二个过程应用 PrincipalPermissionAttribute 类以指定组。

创建 Windows 组

  1. 打开“计算机管理”控制台。

  2. 在左侧面板中单击“本地用户和组”。

  3. 右键单击“组”,再单击“新建组”。

  4. 在“组名称”框中,键入新组的名称。

  5. 在“说明”框中,键入对新组的说明。

  6. 单击“添加”按钮向该组添加新成员。

  7. 如果你已经将自己添加到该组中,并且想要测试下面的代码,则必须注销计算机并重新登录,以便将自己包括到该组中。

要求用户具有成员资格

  1. 打开包含已实现服务协定代码的 Windows Communication Foundation (WCF) 代码文件。 有关实现协定的详细信息,请参阅实现服务协定

  2. PrincipalPermissionAttribute 属性应用于每个必须限制到特定组的方法。 将 Action 属性设置为 Demand,并将 Role 属性设置为组名称。 例如:

    // Only members of the CalculatorClients group can call this method.
    [PrincipalPermission(SecurityAction.Demand, Role = "CalculatorClients")]
    public double Add(double a, double b)
    {
        return a + b;
    }
    
    ' Only members of the CalculatorClients group can call this method.
    <PrincipalPermission(SecurityAction.Demand, Role:="CalculatorClients")> _
    Public Function Add(ByVal a As Double, ByVal b As Double) As Double
        Return a + b
    End Function
    
    

    注意

    如果将 PrincipalPermissionAttribute 属性应用到某个协定,将会引发 SecurityException。 只能在方法级别应用该属性。

使用证书控制对方法的访问

如果客户端凭据类型是证书,还可以使用 PrincipalPermissionAttribute 类控制对方法的访问。 为此,您必须具有证书的主题和指纹。

若要检查证书的属性,请参阅如何:使用 MMC 管理单元查看证书。 若要查找指纹值,请参阅如何:检索证书的指纹

使用证书控制访问

  1. PrincipalPermissionAttribute 类应用于您要对其访问进行限制的方法。

  2. 将属性的操作设置为 SecurityAction.Demand

  3. Name 属性设置为包含主题名称和证书指纹的字符串。 用一个分号和一个空格将这两个值分隔开,如下面的示例所示:

    // Only a client authenticated with a valid certificate that has the
    // specified subject name and thumbprint can call this method.
    [PrincipalPermission(SecurityAction.Demand,
        Name = "CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")]
    public double Multiply(double a, double b)
    {
        return a * b;
    }
    
    ' Only a client authenticated with a valid certificate that has the 
    ' specified subject name and thumbprint can call this method.
    <PrincipalPermission(SecurityAction.Demand, Name:="CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")> _
    Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double
        Return a * b
    End Function
    
  4. PrincipalPermissionMode 属性设置为 UseAspNetRoles,如下面的配置示例所示:

    <behaviors>  
      <serviceBehaviors>  
      <behavior name="SvcBehavior1">  
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" />  
      </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    

    将此值设置为 UseAspNetRoles 表示 NamePrincipalPermissionAttribute 属性将用于执行字符串比较。 在将证书用作客户端凭据时,默认情况下,WCF 会用一个分号将证书公用名和指纹连接起来,以便为客户端的主标识创建一个唯一的值。 在将 UseAspNetRoles 设置为服务上的 PrincipalPermissionMode 之后,会将此主标识值与 Name 属性值进行比较,以确定用户的访问权限。

    此外,在创建自承载服务时,还可以按照以下代码中的方式在代码中设置 PrincipalPermissionMode 属性:

    ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri);
    ServiceAuthorizationBehavior myServiceBehavior =
        myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
    myServiceBehavior.PrincipalPermissionMode =
        PrincipalPermissionMode.UseAspNetRoles;
    
    Dim myServiceBehavior As ServiceAuthorizationBehavior
    myServiceBehavior = _
       myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)()
    myServiceBehavior.PrincipalPermissionMode = _
       PrincipalPermissionMode.UseAspNetRoles
    

另请参阅