Güvenilir Cephe Servisi

TrustedFacade örneği, Windows Communication Foundation (WCF) güvenlik altyapısını kullanarak çağıranın kimlik bilgilerinin bir hizmetten diğerine nasıl akışının yapılacağını gösterir.

Bir hizmet tarafından sağlanan işlevselliği bir cephe hizmeti kullanarak genel ağa göstermek yaygın bir tasarım desenidir. Cephe hizmeti genellikle çevre ağında (DMZ, askeri olmayan bölge ve ekranlı alt ağ olarak da bilinir) bulunur ve iş mantığını uygulayan ve iç verilere erişimi olan bir arka uç hizmetiyle iletişim kurar. Cephe hizmeti ile arka uç hizmeti arasındaki iletişim kanalı bir güvenlik duvarından geçer ve genellikle yalnızca tek bir amaçla sınırlıdır.

Bu örnek aşağıdaki bileşenlerden oluşur:

  • Hesap makinesi istemcisi

  • Hesap makinesi ara yüz hizmeti

  • Hesap makinesi arka uç hizmeti

Ön yüz hizmeti, isteği geçerli kılmak ve arayanın kimliğini doğrulamakla sorumludur. Kimlik doğrulaması ve doğrulama başarılı olduktan sonra, çevre ağındaki denetimli iletişim kanalını kullanarak isteği arka uç hizmetine iletir. İletilen isteğin bir parçası olarak cephe hizmeti, arka uç hizmetinin bu bilgileri işlemesinde kullanabilmesi için arayan kimliği hakkında bilgiler içerir. Çağıranın kimliği, ileti Username üst bilgisindeki bir Security güvenlik belirteci kullanılarak iletilir. Örnek, WCF güvenlik altyapısını kullanarak Security üst bilgisinden bu bilgileri iletir ve ayıklar.

Önemli

Arka uç hizmeti, çağıranın kimliğini doğrulamak için cephe hizmetine güvenir. Bu nedenle, arka uç hizmeti çağıranın kimliğini yeniden doğrulamaz; iletilen istekte cephe hizmeti tarafından sağlanan kimlik bilgilerini kullanır. Bu güven ilişkisi nedeniyle, arka uç hizmetinin, iletilen iletinin güvenilir bir kaynaktan (bu örnekte cephe hizmeti) geldiğinden emin olmak için cephe hizmetinin kimliğini doğrulaması gerekir.

Uygulama

Bu örnekte iki iletişim yolu vardır. Birincisi müşteri ile cephe hizmeti arasında, ikincisi cephe hizmeti ile arka uç hizmeti arasındadır.

İstemci ile Cephe Hizmeti Arasındaki İletişim Yolu

Cephe hizmeti iletişim yolu üzerinden wsHttpBinding kullanan istemci, UserName istemci kimlik bilgisi türünü kullanır. Bu, istemcinin cephe hizmetinde kimlik doğrulaması yapmak için kullanıcı adı ve parola kullandığı ve cephe hizmetinin istemcide kimlik doğrulaması yapmak için X.509 sertifikası kullandığı anlamına gelir. Bağlama yapılandırması aşağıdaki örneğe benzer.

<bindings>
  <wsHttpBinding>
    <binding name="Binding1">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

Arayüz hizmeti, çağıranın kimliğini özel bir UserNamePasswordValidator uygulaması kullanarak doğrular. Tanıtım amacıyla, kimlik doğrulaması yalnızca çağıranın kullanıcı adının sunulan parolayla eşleşmesini sağlar. Gerçek dünyada kullanıcının kimliği büyük olasılıkla Active Directory veya özel ASP.NET Üyelik sağlayıcısı kullanılarak doğrulanmıştır. Doğrulayıcı uygulaması dosyada FacadeService.cs bulunur.

public class MyUserNamePasswordValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        // check that username matches password
        if (null == userName || userName != password)
        {
            Console.WriteLine("Invalid username or password");
            throw new SecurityTokenValidationException(
                       "Invalid username or password");
        }
    }
}

Özel doğrulayıcı, arayüz hizmeti yapılandırma dosyasındaki serviceCredentials özelliğin içinde kullanılmak üzere yapılandırılmıştır. Bu davranış, hizmetin X.509 sertifikasını yapılandırmak için de kullanılır.

<behaviors>
  <serviceBehaviors>
    <behavior name="FacadeServiceBehavior">
      <!--The serviceCredentials behavior allows you to define -->
      <!--a service certificate. -->
      <!--A service certificate is used by the service to  -->
      <!--authenticate itself to its clients and to provide  -->
      <!--message protection. -->
      <!--This configuration references the "localhost"  -->
      <!--certificate installed during the setup instructions. -->
      <serviceCredentials>
        <serviceCertificate
               findValue="localhost"
               storeLocation="LocalMachine"
               storeName="My"
               x509FindType="FindBySubjectName" />
        <userNameAuthentication userNamePasswordValidationMode="Custom"
            customUserNamePasswordValidatorType=
           "Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,
            FacadeService"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Cephe Hizmeti ile Arka Uç Hizmeti Arasındaki İletişim Yolu

Önyüz servisi, arka uç hizmeti iletişim yolunda, birkaç bağlama öğesinden oluşan bir customBinding kullanır. Bu bağlama iki şeyi gerçekleştirir. İletişimin güvenli olduğundan ve güvenilir bir kaynaktan geliyor olduğundan emin olmak için cephe hizmetinin ve arka uç hizmetinin kimliğini doğrular. Ayrıca, ilk çağıranın kimliğini de güvenlik belirteci Username içerisinde iletir. Bu durumda, yalnızca ilk arayan kullanıcının kullanıcı adı arka uç hizmetine iletilir, parola iletiye dahil değildir. Bunun nedeni arka uç hizmetinin, isteği ona iletmeden önce çağıranın kimliğini doğrulamak için cephe hizmetine güvenmesidir. Cephe hizmeti arka uç hizmetinde kimliğini doğruladığı için, arka uç hizmeti iletilen istekte yer alan bilgilere güvenebilir.

Bu iletişim yolunun bağlama yapılandırması aşağıdadır.

<bindings>
  <customBinding>
    <binding name="ClientBinding">
      <security authenticationMode="UserNameOverTransport"/>
      <windowsStreamSecurity/>
      <tcpTransport/>
    </binding>
  </customBinding>
</bindings>

Güvenlik< bağlama öğesi,> ilk çağıranın kullanıcı adı iletimini ve ayıklamasını üstlenir. <windowsStreamSecurity> ve <tcpTransport>, cephe ve arka uç hizmetlerinin ve ileti korumasının kimliğini doğrulamayı üstlenir.

İsteği iletmek için, WCF güvenlik altyapısının bunu iletilen iletiye yerleştirebilmesi amacıyla, ara yüz hizmeti uygulamasının ilk çağıranın kullanıcı adını sağlaması gerekir. İlk çağıranın kullanıcı adı, ön yüz hizmeti uygulamasında sağlanır; bu isim, ön yüz hizmetinin arka uç hizmetiyle iletişim kurmak için kullanılan istemci proxy örneğindeki ClientCredentials özelliğine ayarlanarak belirlenir.

Aşağıdaki kod, GetCallerIdentity yönteminin cephe hizmetinde nasıl uygulandığını gösterir. Diğer yöntemler aynı deseni kullanır.

public string GetCallerIdentity()
{
    CalculatorClient client = new CalculatorClient();
    client.ClientCredentials.UserName.UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name;
    string result = client.GetCallerIdentity();
    client.Close();
    return result;
}

Önceki kodda gösterildiği gibi, özellikte ClientCredentials parola ayarlanmaz, yalnızca kullanıcı adı ayarlanır. WCF güvenlik altyapısı, bu durumda parola olmadan bir kullanıcı adı güvenlik belirteci oluşturur ve bu senaryoda tam olarak bu gereklidir.

Arka uç hizmetinde, kullanıcı adı güvenlik belirtecinde yer alan bilgilerin kimliği doğrulanmalıdır. Varsayılan olarak, WCF güvenliği sağlanan parolayı kullanarak kullanıcıyı bir Windows hesabıyla eşlemeyi dener. Bu durumda, sağlanan bir parola yoktur ve kimlik doğrulaması zaten cephe hizmeti tarafından gerçekleştirildiği için arka uç hizmetinin kullanıcı adının kimliğini doğrulaması gerekmez. WcF'de bu işlevi uygulamak için, yalnızca belirteçte bir kullanıcı adının belirtildiğini zorlayan ve ek kimlik doğrulaması gerçekleştirmeyen bir özel UserNamePasswordValidator özellik sağlanır.

public class MyUserNamePasswordValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        // Ignore the password because it is empty,
        // we trust the facade service to authenticate the client.
        // Accept the username information here so that the
        // application gets access to it.
        if (null == userName)
        {
            Console.WriteLine("Invalid username");
            throw new
             SecurityTokenValidationException("Invalid username");
        }
    }
}

Özel doğrulayıcı, arayüz hizmeti yapılandırma dosyasındaki serviceCredentials özelliğin içinde kullanılmak üzere yapılandırılmıştır.

<behaviors>
  <serviceBehaviors>
    <behavior name="BackendServiceBehavior">
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
           customUserNamePasswordValidatorType=
          "Microsoft.ServiceModel.Samples.MyUserNamePasswordValidator,
           BackendService"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Kullanıcı adı bilgilerini ve güvenilir arayüz hizmeti hesabı hakkındaki bilgileri ayıklamak için arka uç hizmeti uygulamasında ServiceSecurityContext sınıfı kullanılır. Aşağıdaki kod, GetCallerIdentity yönteminin nasıl uygulandığını gösterir.

public string GetCallerIdentity()
{
    // Facade service is authenticated using Windows authentication.
    //Its identity is accessible.
    // On ServiceSecurityContext.Current.WindowsIdentity.
    string facadeServiceIdentityName =
          ServiceSecurityContext.Current.WindowsIdentity.Name;

    // The client name is transmitted using Username authentication on
    //the message level without the password
    // using a supporting encrypted UserNameToken.
    // Claims extracted from this supporting token are available in
    // ServiceSecurityContext.Current.AuthorizationContext.ClaimSets
    // collection.
    string clientName = null;
    foreach (ClaimSet claimSet in
        ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)
    {
        foreach (Claim claim in claimSet)
        {
            if (claim.ClaimType == ClaimTypes.Name &&
                                   claim.Right == Rights.Identity)
            {
                clientName = (string)claim.Resource;
                break;
            }
        }
    }
    if (clientName == null)
    {
        // In case there was no UserNameToken attached to the request.
        // In the real world implementation the service should reject
        // this request.
        return "Anonymous caller via " + facadeServiceIdentityName;
    }

    return clientName + " via " + facadeServiceIdentityName;
}

Cephe hizmeti hesap bilgileri ServiceSecurityContext.Current.WindowsIdentity özelliği kullanılarak ayıklanır. İlk çağıran hakkındaki bilgilere erişmek için arka uç hizmeti özelliğini kullanır ServiceSecurityContext.Current.AuthorizationContext.ClaimSets . türüne Identitysahip bir Name talep arar. Bu talep, güvenlik belirtecinde Username yer alan bilgilerden WCF güvenlik altyapısı tarafından otomatik olarak oluşturulur.

Örneği çalıştırma

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın. Hizmetleri kapatmak için cephe ve arka uç hizmet konsolu pencerelerinde ENTER tuşuna basabilirsiniz.

Username authentication required.
Provide a valid machine or domain ac
   Enter username:
user
   Enter password:
****
user via MyMachine\testaccount
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Güvenilen Cephe senaryosu örneğinde bulunan Setup.bat toplu iş dosyası, istemcide kimliğini doğrulamak için sertifika tabanlı güvenlik gerektiren cephe hizmetini çalıştırmak için sunucuyu ilgili bir sertifikayla yapılandırmanıza olanak tanır. Ayrıntılar için bu konunun sonundaki kurulum yordamına bakın.

Aşağıda, toplu iş dosyalarının farklı bölümlerine kısa bir genel bakış sağlanmaktadır.

  • Sunucu sertifikası oluşturuluyor.

    Setup.bat toplu iş dosyasındaki aşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    

    %SERVER_NAME% değişkeni sunucu adını belirtir; varsayılan değer localhost'tır. Sertifika LocalMachine deposunda depolanır.

  • Cephe hizmetinin sertifikasını istemcinin güvenilen sertifika deposuna yükleme.

    Aşağıdaki satır, cephe hizmetinin sertifikasını istemcinin güvenilen kişiler deposuna kopyalar. Makecert.exe tarafından oluşturulan sertifikalara istemci sistemi tarafından örtük olarak güvenilmediğinden bu adım gereklidir. İstemci güvenilen kök sertifikasında (örneğin, Microsoft tarafından verilen bir sertifika) köke sahip bir sertifikanız zaten varsa, istemci sertifika depoyu sunucu sertifikasıyla doldurma adımı gerekli değildir.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

Örneği aynı makinede çalıştırmak için

  1. Yolun, Makecert.exe bulunduğu klasörü içerdiğinden emin olun.

  2. Örnek yükleme klasöründen Setup.bat çalıştırın. Bu, örneği çalıştırmak için gereken tüm sertifikaları yükler.

  3. \BackendService\bin dizininden ayrı bir konsol penceresinde BackendService.exe başlatın

  4. \FacadeService\bin dizininden FacadeService.exe'ı ayrı bir konsol penceresinde başlatın

  5. \client\bin konumundan Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.

  6. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.

Örnekten sonra temizlik yapmak için

  1. Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.