Dela via


Gör så här: Begränsa åtkomst med klassen PrincipalPermissionAttribute

Att styra åtkomsten till resurser på en Windows-domändator är en grundläggande säkerhetsuppgift. Till exempel bör endast vissa användare kunna visa känsliga data, till exempel löneinformation. Det här avsnittet beskriver hur du begränsar åtkomsten till en metod genom att kräva att användaren tillhör en fördefinierad grupp. Ett arbetsexempel finns i Auktorisera åtkomst till tjänståtgärder.

Uppgiften består av två separata procedurer. Den första skapar gruppen och fyller den med användare. Den andra använder PrincipalPermissionAttribute klassen för att ange gruppen.

Skapa en Windows-grupp

  1. Öppna datorhanteringskonsolen.

  2. I den vänstra panelen klickar du på Lokala användare och grupper.

  3. Högerklicka på Grupper och klicka på Ny grupp.

  4. I rutan Gruppnamn skriver du ett namn för den nya gruppen.

  5. I rutan Beskrivning skriver du en beskrivning av den nya gruppen.

  6. Klicka på knappen Lägg till för att lägga till nya medlemmar i gruppen.

  7. Om du har lagt till dig själv i gruppen och vill testa följande kod måste du logga ut datorn och logga in igen för att ingå i gruppen.

Så här kräver du användarmedlemskap

  1. Öppna WCF-kodfilen (Windows Communication Foundation) som innehåller den implementerade tjänstkontraktskoden. Mer information om hur du implementerar ett kontrakt finns i Implementering av tjänstkontrakt.

  2. PrincipalPermissionAttribute Använd attributet för varje metod som måste begränsas till en viss grupp. Action Ange egenskapen till Demand och Role egenskapen till namnet på gruppen. Till exempel:

    // 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
    
    

    Kommentar

    Om du tillämpar attributet på PrincipalPermissionAttribute ett kontrakt genereras ett SecurityException . Du kan bara använda attributet på metodnivå.

Använda ett certifikat för att kontrollera åtkomsten till en metod

Du kan också använda PrincipalPermissionAttribute klassen för att styra åtkomsten till en metod om klientautentiseringstypen är ett certifikat. För att göra detta måste du ha certifikatets ämne och tumavtryck.

Information om hur du undersöker ett certifikat för dess egenskaper finns i Så här visar du certifikat med MMC-snapin-modulen. Information om hur du hittar tumavtrycksvärdet finns i Så här hämtar du tumavtrycket för ett certifikat.

Så här kontrollerar du åtkomst med hjälp av ett certifikat

  1. Tillämpa klassen på PrincipalPermissionAttribute den metod som du vill begränsa åtkomsten till.

  2. Ange attributets åtgärd till SecurityAction.Demand.

  3. Ange egenskapen Name till en sträng som består av ämnesnamnet och certifikatets tumavtryck. Avgränsa de två värdena med ett semikolon och ett blanksteg, som du ser i följande exempel:

    // 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. Ange egenskapen PrincipalPermissionMode till UseAspNetRoles enligt följande konfigurationsexempel:

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

    Om du anger det här värdet till UseAspNetRoles anger du att Name egenskapen PrincipalPermissionAttribute för ska användas för att utföra en strängjämförelse. När ett certifikat används som klientautentiseringsuppgifter sammanfogar WCF som standard certifikatets gemensamma namn och tumavtrycket med ett semikolon för att skapa ett unikt värde för klientens primära identitet. Med UseAspNetRoles angivet som PrincipalPermissionMode på tjänsten jämförs det här primära identitetsvärdet med Name egenskapsvärdet för att fastställa användarens åtkomsträttigheter.

    När du skapar en lokalt installerad tjänst kan du också ange PrincipalPermissionMode egenskapen i kod enligt följande kod:

    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
    

Se även