Hizmet Kimliği Örneği
Bu hizmet kimliği örneği, bir hizmet için kimliğin nasıl ayarlandığını gösterir. Tasarım zamanında, istemci hizmetin meta verilerini kullanarak kimliği alabilir ve ardından çalışma zamanında istemci hizmetin kimliğini doğrulayabilir. Hizmet kimliği kavramı, istemcinin herhangi bir işlemi çağırmadan önce bir hizmetin kimliğini doğrulamasına izin vermek ve böylece istemciyi kimliği doğrulanmamış çağrılara karşı korumaktır. Güvenli bir bağlantıda hizmet, erişim izni vermeden önce istemcinin kimlik bilgilerini de doğrular, ancak bu örnekte odak noktası bu değildir. İstemcide sunucu kimlik doğrulamasını gösteren örneklere bakın.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Bu örnekte aşağıdaki özellikler gösterilmektedir:
Bir hizmet için farklı uç noktalarda farklı kimlik türlerini ayarlama. Her kimlik türünün farklı özellikleri vardır. Kullanılacak kimlik türü, uç noktanın bağlaması üzerinde kullanılan güvenlik kimlik bilgilerinin türüne bağlıdır.
Kimlik, yapılandırmada bildirim temelli olarak veya kodda kesin olarak ayarlanabilir. Genellikle hem istemci hem de hizmet için kimliği ayarlamak için yapılandırmayı kullanmanız gerekir.
İstemcide özel kimlik ayarlama. Özel kimlik, genellikle istemcinin hizmeti çağırmadan önce yetkilendirme kararları almak için hizmetin kimlik bilgilerinde sağlanan diğer talep bilgilerini incelemesine olanak tanıyan mevcut bir kimlik türünün özelleştirmesidir.
Not
Bu örnek, identity.com adlı belirli bir sertifikanın kimliğini ve bu sertifikanın içinde yer alan RSA anahtarını denetler. İstemcide yapılandırmada Sertifika ve RSA kimlik türlerini kullanırken, bu değerleri elde etmenin kolay bir yolu, bu değerlerin seri hale getirildiği hizmet için WSDL'yi incelemektir.
Aşağıdaki örnek kod, WSHttpBinding kullanarak bir sertifikanın Etki Alanı Adı Sunucusu (DNS) ile bir hizmet uç noktasının kimliğini yapılandırmayı gösterir.
//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;
Kimlik, App.config dosyasındaki yapılandırmada da belirtilebilir. Aşağıdaki örnekte, bir hizmet uç noktası için UPN (Kullanıcı Asıl Adı) kimliğinin nasıl ayarlanacağı gösterilmektedir.
<endpoint address="upnidentity"
behaviorConfiguration=""
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_Windows"
name="WSHttpBinding_ICalculator_Windows"
contract="Microsoft.ServiceModel.Samples.ICalculator">
<!-- Set the UPN identity for this endpoint -->
<identity>
<userPrincipalName value="host\myservice.com" />
</identity >
</endpoint>
ve IdentityVerifier sınıflarından EndpointIdentity türetilerek istemcide özel kimlik ayarlanabilir. Kavramsal olarak sınıfı, IdentityVerifier hizmetin AuthorizationManager
sınıfının istemci eşdeğeri olarak kabul edilebilir. Aşağıdaki kod örneği, sunucu sertifikasının OrgEndpointIdentity
konu adıyla eşleşecek bir kuruluş adını depolayan uygulamasını gösterir. Kuruluş adı için yetkilendirme denetimi, sınıfındaki CheckAccess
yönteminde CustomIdentityVerifier
gerçekleşir.
// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
private string orgClaim;
public OrgEndpointIdentity(string orgName)
{
orgClaim = orgName;
}
public string OrganizationClaim
{
get { return orgClaim; }
set { orgClaim = value; }
}
}
//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
{
bool returnvalue = false;
foreach (ClaimSet claimset in authContext.ClaimSets)
{
foreach (Claim claim in claimset)
{
if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
{
X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
{
Console.WriteLine("Claim Type: {0}",claim.ClaimType);
Console.WriteLine("Right: {0}", claim.Right);
Console.WriteLine("Resource: {0}",claim.Resource);
Console.WriteLine();
returnvalue = true;
}
}
}
}
return returnvalue;
}
}
Bu örnek, dile özgü Kimlik çözümü klasöründe yer alan identity.com adlı bir sertifika kullanır.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Örneği tek veya bilgisayarlar arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.
Örneği aynı bilgisayarda çalıştırmak için
Windows XP veya Windows Vista'da, IDENTITY çözümü klasöründeki Identity.pfx sertifika dosyasını MMC ek bileşeni aracını kullanarak LocalMachine/My (Kişisel) sertifika deposuna aktarın. Bu dosya parola korumalıdır. İçeri aktarma sırasında parola girmeniz istenir. Parola kutusuna yazın
xyz
. Daha fazla bilgi için Nasıl yapılır: MMC Ek Bileşeni ile Sertifikaları Görüntüleme konusuna bakın. Bu işlem tamamlandıktan sonra, Setup.bat yönetici ayrıcalıklarıyla Visual Studio için Geliştirici Komut İstemi'nde çalıştırın ve bu sertifikayı istemcide kullanılmak üzere CurrentUser/Trusted Kişiler deposuna kopyalar.Windows Server 2003'te, yönetici ayrıcalıklarıyla bir Visual Studio komut istemi içindeki ö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.
Not
Setup.bat toplu iş dosyası, Visual Studio Komut İsteminden çalıştırılacak şekilde tasarlanmıştır. Visual Studio Komut İstemi içinde ayarlanan PATH ortam değişkeni, Setup.bat betiği tarafından gereken yürütülebilir dosyaları içeren dizine işaret eder. Örnekle işiniz bittiğinde Cleanup.bat çalıştırarak sertifikaları kaldırdığınızdan emin olun. Diğer güvenlik örnekleri aynı sertifikaları kullanır.
\service\bin dizininden Service.exe başlatın. Hizmetin hazır olduğunu gösterdiğinden emin olun ve hizmeti sonlandırmak için Enter tuşuna> basın <istemini görüntüler.
\client\bin dizininden veya derlemek ve çalıştırmak için Visual Studio'da F5 tuşuna basarak Client.exe başlatın. İstemci etkinliği, istemci konsol uygulamasında görüntülenir.
İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.
Örneği bilgisayarlar arasında çalıştırmak için
Örneğin istemci bölümünü oluşturmadan önce, yöntemindeki Client.cs dosyasında hizmetin uç nokta adresinin değerini değiştirdiğinizden
CallServiceCustomClientIdentity
emin olun. Ardından örneği oluşturun.Hizmet bilgisayarında bir dizin oluşturun.
Hizmet programı dosyalarını service\bin dosyasından hizmet bilgisayarındaki dizine kopyalayın. Ayrıca Setup.bat ve Cleanup.bat dosyalarını hizmet bilgisayarına kopyalayın.
İstemci ikili dosyaları için istemci bilgisayarda bir dizin oluşturun.
İstemci programı dosyalarını istemci bilgisayardaki istemci dizinine kopyalayın. Ayrıca Setup.bat, Cleanup.bat ve ImportServiceCert.bat dosyalarını istemciye kopyalayın.
Hizmette, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde komutunu çalıştırın
setup.bat service
. bağımsız değişkeniyleservice
çalıştırmaksetup.bat
, bilgisayarın tam etki alanı adına sahip bir hizmet sertifikası oluşturur ve hizmet sertifikasını Service.cer adlı bir dosyaya aktarır.Service.cer dosyasını hizmet dizininden istemci bilgisayardaki istemci dizinine kopyalayın.
İstemci bilgisayardaki Client.exe.config dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. Değiştirilmesi gereken birden çok örnek vardır.
İstemcide, yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde ImportServiceCert.bat çalıştırın. Bu, hizmet sertifikasını Service.cer dosyasından CurrentUser - Trusted Kişiler deposuna aktarır.
Hizmet bilgisayarında, komut isteminden Service.exe başlatın.
İstemci bilgisayarda bir komut isteminden Client.exe başlatın. İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.
Örnekten sonra temizlemek için
Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.
Not
Bu betik, bu örneği bilgisayarlar arasında çalıştırırken istemcideki hizmet sertifikalarını kaldırmaz. Bilgisayarlar arasında sertifika kullanan Windows Communication Foundation (WCF) örnekleri çalıştırdıysanız CurrentUser - Trusted Kişiler deposuna yüklenmiş hizmet sertifikalarını temizlediğinizden emin olun. Bunu yapmak için şu komutu kullanın:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Örneğin:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.