Aracılığıyla paylaş


Nasıl yapılır: Bir Hizmet için Özel Yetkilendirme Yöneticisi Oluşturma

Windows Communication Foundation'daki (WCF) Kimlik Modeli altyapısı, genişletilebilir talep tabanlı yetkilendirme modelini destekler. Talepler belirteçlerden ayıklanır ve isteğe bağlı olarak özel yetkilendirme ilkeleri tarafından işlenir ve sonra içine AuthorizationContextyerleştirilir. Yetkilendirme yöneticisi, yetkilendirme kararları almak için içindeki AuthorizationContext talepleri inceler.

Varsayılan olarak, yetkilendirme kararları sınıfı tarafından ServiceAuthorizationManager yapılır; ancak bu kararlar özel yetkilendirme yöneticisi oluşturularak geçersiz kılınabilir. Özel yetkilendirme yöneticisi oluşturmak için, yönteminden ServiceAuthorizationManager türetilen ve uygulayan CheckAccessCore bir sınıf oluşturun. Yetkilendirme kararları yönteminde CheckAccessCore verilir ve bu, erişim verildiğinde ve false erişim reddedildiğinde döndürürtrue.

Yetkilendirme kararı ileti gövdesinin içeriğine bağlıysa yöntemini kullanın CheckAccess .

Performans sorunları nedeniyle, mümkünse, yetkilendirme kararının ileti gövdesine erişim gerektirmemesi için uygulamanızı yeniden tasarlamanız gerekir.

Bir hizmet için özel yetkilendirme yöneticisinin kaydı kod veya yapılandırmada yapılabilir.

Özel yetkilendirme yöneticisi oluşturmak için

  1. sınıfından bir sınıf türet.ServiceAuthorizationManager

    public class MyServiceAuthorizationManager : ServiceAuthorizationManager
    {
    
    
    Public Class MyServiceAuthorizationManager
        Inherits ServiceAuthorizationManager
    
    
  2. CheckAccessCore(OperationContext) yöntemini geçersiz kılın.

    OperationContext Yetkilendirme kararları almak için yöntemine CheckAccessCore(OperationContext) geçirilen öğesini kullanın.

    Aşağıdaki kod örneği, yetkilendirme kararı vermek için özel talebi http://www.contoso.com/claims/allowedoperation bulmak için yöntemini kullanırFindClaims(String, String).

    protected override bool CheckAccessCore(OperationContext operationContext)
    {
      // Extract the action URI from the OperationContext. Match this against the claims
      // in the AuthorizationContext.
      string action = operationContext.RequestContext.RequestMessage.Headers.Action;
    
      // Iterate through the various claim sets in the AuthorizationContext.
      foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
      {
        // Examine only those claim sets issued by System.
        if (cs.Issuer == ClaimSet.System)
        {
          // Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
            foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty))
          {
            // If the Claim resource matches the action URI then return true to allow access.
            if (action == c.Resource.ToString())
              return true;
          }
        }
      }
    
      // If this point is reached, return false to deny access.
      return false;
    }
    
    Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean
        ' Extract the action URI from the OperationContext. Match this against the claims.
        ' in the AuthorizationContext.
        Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action
    
        ' Iterate through the various claimsets in the AuthorizationContext.
        Dim cs As ClaimSet
        For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
            ' Examine only those claim sets issued by System.
            If cs.Issuer Is ClaimSet.System Then
                ' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
                Dim c As Claim
                For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _
                     Rights.PossessProperty)
                    ' If the Claim resource matches the action URI then return true to allow access.
                    If action = c.Resource.ToString() Then
                        Return True
                    End If
                Next c
            End If
        Next cs
        ' If this point is reached, return false to deny access.
        Return False
    
    End Function
    

Kod kullanarak özel yetkilendirme yöneticisi kaydetmek için

  1. Özel yetkilendirme yöneticisinin bir örneğini oluşturun ve özelliğine atayın ServiceAuthorizationManager .

    ServiceAuthorizationBehavior özelliği kullanılarak Authorization erişilebilir.

    Aşağıdaki kod örneği özel yetkilendirme yöneticisini MyServiceAuthorizationManager kaydeder.

    // Add a custom authorization manager to the service authorization behavior.
    serviceHost.Authorization.ServiceAuthorizationManager =
               new MyServiceAuthorizationManager();
    
    ' Add a custom authorization manager to the service authorization behavior.
    serviceHost.Authorization.ServiceAuthorizationManager = _
        New MyServiceAuthorizationManager()
    
    

Yapılandırma kullanarak özel yetkilendirme yöneticisi kaydetmek için

  1. Hizmetin yapılandırma dosyasını açın.

  2. Davranışlara>< serviceAuthorization>< ekleyin.

    serviceAuthorization'a ><bir serviceAuthorizationManagerType öznitelik ekleyin ve değerini özel yetkilendirme yöneticisini temsil eden türe ayarlayın.

  3. İstemci ve hizmet arasındaki iletişimin güvenliğini sağlayan bir bağlama ekleyin.

    Bu iletişim için seçilen bağlama, özel yetkilendirme yöneticisinin yetkilendirme kararları almak için kullandığı öğesine eklenen AuthorizationContexttalepleri belirler. Sistem tarafından sağlanan bağlamalar hakkında daha fazla bilgi için bkz . Sistem Tarafından Sağlanan Bağlamalar.

  4. Bir hizmet öğesi ekleyerek davranışı bir <hizmet> uç noktasıyla ilişkilendirin ve özniteliğin behaviorConfiguration değerini davranış> öğesinin name özniteliğinin <değerine ayarlayın.

    Hizmet uç noktasını yapılandırma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Yapılandırmada Hizmet Uç Noktası Oluşturma.

    Aşağıdaki kod örneği özel yetkilendirme yöneticisini Samples.MyServiceAuthorizationManagerkaydeder.

    <configuration>
      <system.serviceModel>
        <services>
          <service
              name="Microsoft.ServiceModel.Samples.CalculatorService"
              behaviorConfiguration="CalculatorServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
              </baseAddresses>
            </host>
            <endpoint address=""
                      binding="wsHttpBinding_Calculator"
                      contract="Microsoft.ServiceModel.Samples.ICalculator" />
          </service>
        </services>
        <bindings>
          <WSHttpBinding>
           <binding name = "wsHttpBinding_Calculator">
             <security mode="Message">
               <message clientCredentialType="Windows"/>
             </security>
            </binding>
          </WSHttpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="CalculatorServiceBehavior">
              <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" />
             </behavior>
         </serviceBehaviors>
       </behaviors>
      </system.serviceModel>
    </configuration>
    

    Uyarı

    serviceAuthorizationManagerType değerini belirttiğinizde dizenin tam tür adını içermesi gerektiğini unutmayın. virgül ve türün tanımlandığı derlemenin adı. Derleme adını atlarsanız, WCF türü System.ServiceModel.dll yüklemeyi dener.

Örnek

Aşağıdaki kod örneği, yöntemini geçersiz kılmayı içeren bir ServiceAuthorizationManager sınıfın CheckAccessCore temel uygulamasını gösterir. Örnek kod, özel talep için öğesini AuthorizationContext inceler ve bu özel talebin kaynağından gelen OperationContexteylem değeriyle eşleştiğinde döndürürtrue. Bir sınıfın daha eksiksiz bir ServiceAuthorizationManager uygulaması için bkz . Yetkilendirme İlkesi.

public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
  protected override bool CheckAccessCore(OperationContext operationContext)
  {
    // Extract the action URI from the OperationContext. Match this against the claims
    // in the AuthorizationContext.
    string action = operationContext.RequestContext.RequestMessage.Headers.Action;
  
    // Iterate through the various claim sets in the AuthorizationContext.
    foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
    {
      // Examine only those claim sets issued by System.
      if (cs.Issuer == ClaimSet.System)
      {
        // Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
          foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty))
        {
          // If the Claim resource matches the action URI then return true to allow access.
          if (action == c.Resource.ToString())
            return true;
        }
      }
    }
  
    // If this point is reached, return false to deny access.
    return false;
  }
}

Public Class MyServiceAuthorizationManager
    Inherits ServiceAuthorizationManager

    Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean
        ' Extract the action URI from the OperationContext. Match this against the claims.
        ' in the AuthorizationContext.
        Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action

        ' Iterate through the various claimsets in the AuthorizationContext.
        Dim cs As ClaimSet
        For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
            ' Examine only those claim sets issued by System.
            If cs.Issuer Is ClaimSet.System Then
                ' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
                Dim c As Claim
                For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _
                     Rights.PossessProperty)
                    ' If the Claim resource matches the action URI then return true to allow access.
                    If action = c.Resource.ToString() Then
                        Return True
                    End If
                Next c
            End If
        Next cs
        ' If this point is reached, return false to deny access.
        Return False

    End Function
End Class

Ayrıca bkz.