Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu örnek, bir Windows Communication Foundation (WCF) uygulamasına özel belirteç uygulamasının nasıl ekleneceğini gösterir. Örnek, istemci kredi kartları hakkındaki bilgileri hizmete güvenli bir şekilde geçirmek için bir CreditCardToken kullanır. Belirteç WS-Security ileti üst bilgisinde geçirilir ve ileti gövdesi ve diğer ileti üst bilgileriyle birlikte simetrik güvenlik bağlama öğesi kullanılarak imzalanır ve şifrelenir. Bu, yerleşik belirteçlerin yeterli olmadığı durumlarda kullanışlıdır. Bu örnek, yerleşik belirteçlerden birini kullanmak yerine bir hizmete özel güvenlik belirteci sağlamayı gösterir. Hizmet, istek-yanıt iletişim desenini tanımlayan bir sözleşme uygular.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Özetlemek gerekirse, bu örnek aşağıdakileri gösterir:
İstemci özel bir güvenlik belirtecini nasıl bir hizmete gönderebilir.
Hizmetin özel bir güvenlik belirtecini nasıl tüketip doğrulayabileceği.
WCF hizmet kodunun, özel güvenlik belirteci de dahil olmak üzere alınan güvenlik belirteçleri hakkındaki bilgileri nasıl edinebileceği.
sunucunun X.509 sertifikasının ileti şifreleme ve imza için kullanılan simetrik anahtarı korumak için nasıl kullanıldığı.
Özel Güvenlik Belirteci Kullanarak İstemci Kimlik Doğrulaması
Hizmet, BindingHelper ve EchoServiceHost sınıfları kullanılarak programatik olarak oluşturulan tek uç nokta olarak kullanıma sunar. Uç nokta bir adres, bir bağlama ve bir sözleşmeden oluşur. Bağlama, SymmetricSecurityBindingElement ve HttpTransportBindingElement kullanılarak özel bir bağlama ile yapılandırılır. Bu örnek, hizmetin X.509 sertifikasını kullanarak iletim sırasında simetrik anahtarı korumak ve özelleştirilmiş bir güvenlik belirtecini imzalı ve şifrelenmiş olarak WS-Security mesaj başlığı içerisinde SymmetricSecurityBindingElement şeklinde geçirmek üzere ayarlar. Davranış, istemci kimlik doğrulaması için kullanılacak hizmet kimlik bilgilerini ve ayrıca hizmet X.509 sertifikası hakkındaki bilgileri belirtir.
public static class BindingHelper
{
public static Binding CreateCreditCardBinding()
{
var httpTransport = new HttpTransportBindingElement();
// The message security binding element will be configured to require a credit card.
// The token that is encrypted with the service's certificate.
var messageSecurity = new SymmetricSecurityBindingElement();
messageSecurity.EndpointSupportingTokenParameters.SignedEncrypted.Add(new CreditCardTokenParameters());
X509SecurityTokenParameters x509ProtectionParameters = new X509SecurityTokenParameters();
x509ProtectionParameters.InclusionMode = SecurityTokenInclusionMode.Never;
messageSecurity.ProtectionTokenParameters = x509ProtectionParameters;
return new CustomBinding(messageSecurity, httpTransport);
}
}
Kredi kartı belirtecini iletide kullanmak için örnek kod, bu işlevi sağlamak üzere özel hizmet kimlik bilgilerini kullanır. Hizmet kimlik bilgileri sınıfı, CreditCardServiceCredentials sınıfında yer alır ve EchoServiceHost.InitializeRuntime yönteminde, hizmet konağının davranış koleksiyonlarına eklenir.
class EchoServiceHost : ServiceHost
{
string creditCardFile;
public EchoServiceHost(parameters Uri[] addresses)
: base(typeof(EchoService), addresses)
{
creditCardFile = ConfigurationManager.AppSettings["creditCardFile"];
if (string.IsNullOrEmpty(creditCardFile))
{
throw new ConfigurationErrorsException("creditCardFile not specified in service config");
}
creditCardFile = String.Format("{0}\\{1}", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, creditCardFile);
}
override protected void InitializeRuntime()
{
// Create a credit card service credentials and add it to the behaviors.
CreditCardServiceCredentials serviceCredentials = new CreditCardServiceCredentials(this.creditCardFile);
serviceCredentials.ServiceCertificate.SetCertificate("CN=localhost", StoreLocation.LocalMachine, StoreName.My);
this.Description.Behaviors.Remove((typeof(ServiceCredentials)));
this.Description.Behaviors.Add(serviceCredentials);
// Register a credit card binding for the endpoint.
Binding creditCardBinding = BindingHelper.CreateCreditCardBinding();
this.AddServiceEndpoint(typeof(IEchoService), creditCardBinding, string.Empty);
base.InitializeRuntime();
}
}
İstemci uç noktası, hizmet uç noktasıyla benzer şekilde yapılandırılır. İstemci, bağlama oluşturmak için aynı BindingHelper sınıfı kullanır. Kurulumun geri kalanı sınıfında Client bulunur. İstemci ayrıca CreditCardToken içinde yer alacak bilgileri ve hizmet X.509 sertifikası hakkındaki bilgileri, uygun verileri içeren bir CreditCardClientCredentials örneğini istemci uç noktası davranış koleksiyonuna ekleyerek kurulum kodunda ayarlar. Örnek, konu adı CN=localhost olarak ayarlanmış X.509 sertifikasını hizmet sertifikası olarak kullanır.
Binding creditCardBinding = BindingHelper.CreateCreditCardBinding();
var serviceAddress = new EndpointAddress("http://localhost/servicemodelsamples/service.svc");
// Create a client with given client endpoint configuration.
channelFactory = new ChannelFactory<IEchoService>(creditCardBinding, serviceAddress);
// Configure the credit card credentials on the channel factory.
var credentials =
new CreditCardClientCredentials(
new CreditCardInfo(creditCardNumber, issuer, expirationTime));
// Configure the service certificate on the credentials.
credentials.ServiceCertificate.SetDefaultCertificate(
"CN=localhost", StoreLocation.LocalMachine, StoreName.My);
// Replace ClientCredentials with CreditCardClientCredentials.
channelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
channelFactory.Endpoint.Behaviors.Add(credentials);
client = channelFactory.CreateChannel();
Console.WriteLine($"Echo service returned: {client.Echo()}");
((IChannel)client).Close();
channelFactory.Close();
Özel Güvenlik Belirteci Uygulaması
WCF'de özel bir güvenlik belirtecini etkinleştirmek için özel güvenlik belirtecinin nesne gösterimini oluşturun. Örneğin, CreditCardToken sınıfında bu temsil vardır. Nesne gösterimi, tüm ilgili güvenlik belirteci bilgilerini tutmak ve güvenlik belirtecinde yer alan güvenlik anahtarlarının listesini sağlamakla sorumludur. Bu durumda, kredi kartı güvenlik belirteci herhangi bir güvenlik anahtarı içermez.
Sonraki bölümde, özel belirtecin kablo üzerinden iletilmesini ve WCF uç noktası tarafından tüketilmesini sağlamak için yapılması gerekenler açıklanmaktadır.
class CreditCardToken : SecurityToken
{
CreditCardInfo cardInfo;
DateTime effectiveTime = DateTime.UtcNow;
string id;
ReadOnlyCollection<SecurityKey> securityKeys;
public CreditCardToken(CreditCardInfo cardInfo) : this(cardInfo, Guid.NewGuid().ToString()) { }
public CreditCardToken(CreditCardInfo cardInfo, string id)
{
if (cardInfo == null)
throw new ArgumentNullException(nameof(cardInfo));
if (id == null)
throw new ArgumentNullException(nameof(id));
this.cardInfo = cardInfo;
this.id = id;
// The credit card token is not capable of any cryptography.
this.securityKeys = new ReadOnlyCollection<SecurityKey>(new List<SecurityKey>());
}
public CreditCardInfo CardInfo { get { return this.cardInfo; } }
public override ReadOnlyCollection<SecurityKey> SecurityKeys { get { return this.securityKeys; } }
public override DateTime ValidFrom { get { return this.effectiveTime; } }
public override DateTime ValidTo { get { return this.cardInfo.ExpirationDate; } }
public override string Id { get { return this.id; } }
}
Mesajdan ve Mesaja Özelleştirilmiş Kredi Kartı Belirteci Alma
WCF'deki güvenlik belirteci serileştiricileri, iletideki XML'den güvenlik belirteçlerinin nesne gösterimini oluşturmaktan ve güvenlik belirteçlerinin XML biçimini oluşturmaktan sorumludur. Güvenlik belirteçlerini işaret eden anahtar tanımlayıcılarını okuma ve yazma gibi diğer işlevlerden de sorumludurlar, ancak bu örnekte yalnızca güvenlik belirteci ile ilgili işlevler kullanılır. Özel bir token'i etkinleştirmek için kendi güvenlik tokeni seri hale getiricinizi oluşturmanız gerekir. Bu örnek, bu amaç için sınıfını CreditCardSecurityTokenSerializer kullanır.
Hizmette, özel seri hale getirici özel belirtecin XML biçimini okur ve ondan özel belirteç nesnesi gösterimini oluşturur.
İstemcide sınıfı, CreditCardSecurityTokenSerializer güvenlik belirteci nesne gösteriminde yer alan bilgileri XML yazıcısına yazar.
public class CreditCardSecurityTokenSerializer : WSSecurityTokenSerializer
{
public CreditCardSecurityTokenSerializer(SecurityTokenVersion version) : base() { }
protected override bool CanReadTokenCore(XmlReader reader)
{
XmlDictionaryReader localReader = XmlDictionaryReader.CreateDictionaryReader(reader);
if (reader == null)
throw new ArgumentNullException(nameof(reader));
if (reader.IsStartElement(Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace))
return true;
return base.CanReadTokenCore(reader);
}
protected override SecurityToken ReadTokenCore(XmlReader reader, SecurityTokenResolver tokenResolver)
{
if (reader == null)
throw new ArgumentNullException(nameof(reader));
if (reader.IsStartElement(Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace))
{
string id = reader.GetAttribute(Constants.Id, Constants.WsUtilityNamespace);
reader.ReadStartElement();
// Read the credit card number.
string creditCardNumber = reader.ReadElementString(Constants.CreditCardNumberElementName, Constants.CreditCardTokenNamespace);
// Read the expiration date.
string expirationTimeString = reader.ReadElementString(Constants.CreditCardExpirationElementName, Constants.CreditCardTokenNamespace);
DateTime expirationTime = XmlConvert.ToDateTime(expirationTimeString, XmlDateTimeSerializationMode.Utc);
// Read the issuer of the credit card.
string creditCardIssuer = reader.ReadElementString(Constants.CreditCardIssuerElementName, Constants.CreditCardTokenNamespace);
reader.ReadEndElement();
var cardInfo = new CreditCardInfo(creditCardNumber, creditCardIssuer, expirationTime);
return new CreditCardToken(cardInfo, id);
}
else
{
return WSSecurityTokenSerializer.DefaultInstance.ReadToken(reader, tokenResolver);
}
}
protected override bool CanWriteTokenCore(SecurityToken token)
{
if (token is CreditCardToken)
return true;
return base.CanWriteTokenCore(token);
}
protected override void WriteTokenCore(XmlWriter writer, SecurityToken token)
{
if (writer == null)
throw new ArgumentNullException(nameof(writer));
if (token == null)
throw new ArgumentNullException(nameof(token));
CreditCardToken c = token as CreditCardToken;
if (c != null)
{
writer.WriteStartElement(Constants.CreditCardTokenPrefix, Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace);
writer.WriteAttributeString(Constants.WsUtilityPrefix, Constants.Id, Constants.WsUtilityNamespace, token.Id);
writer.WriteElementString(Constants.CreditCardNumberElementName, Constants.CreditCardTokenNamespace, c.CardInfo.CardNumber);
writer.WriteElementString(Constants.CreditCardExpirationElementName, Constants.CreditCardTokenNamespace, XmlConvert.ToString(c.CardInfo.ExpirationDate, XmlDateTimeSerializationMode.Utc));
writer.WriteElementString(Constants.CreditCardIssuerElementName, Constants.CreditCardTokenNamespace, c.CardInfo.CardIssuer);
writer.WriteEndElement();
writer.Flush();
}
else
{
base.WriteTokenCore(writer, token);
}
}
}
Belirteç Sağlayıcısı ve Belirteç Doğrulayıcı Sınıfları Nasıl Oluşturulur?
İstemci ve hizmet kimlik bilgileri, güvenlik belirteci yöneticisi örneğinin oluşturulmasından sorumludur. Güvenlik belirteci yöneticisi örneği belirteç sağlayıcılarını, belirteç kimlik doğrulayıcılarını ve belirteç serileştiricilerini almak için kullanılır.
Belirteç sağlayıcısı, istemci veya hizmet kimlik bilgilerinde yer alan bilgilere göre belirtecin nesne gösterimini oluşturur. Belirteç nesnesi gösterimi daha sonra belirteç seri hale getiricisi kullanılarak iletiye yazılır (önceki bölümde anlatılmıştır).
Belirteç doğrulayıcı, iletiye ulaşan belirteçleri doğrular. Gelen belirteç nesnesi gösterimi, belirteç seri hale getiricisi tarafından oluşturulur. Bu nesne gösterimi daha sonra doğrulama için belirteç doğrulayıcıya geçirilir. Belirteç başarıyla doğrulandıktan sonra, belirteç doğrulayıcı belirteçte yer alan bilgileri temsil eden bir nesne koleksiyonu IAuthorizationPolicy döndürür. Bu bilgiler daha sonra ileti işleme sırasında yetkilendirme kararları almak ve uygulamaya yönelik talepler sağlamak için kullanılır. Bu örnekte, kredi kartı belirteci doğrulayıcı bu amaçla kullanır CreditCardTokenAuthorizationPolicy .
Belirteç serileştiricisi, belirtecin nesne gösterimini kablodan almaktan sorumludur. Bu, önceki bölümde ele alınmıştı.
Bu örnekte, bir kredi kartı belirtecini yalnızca istemciden hizmete yönünde iletmek istediğimizden, belirteç sağlayıcısını yalnızca istemcide ve belirteç kimlik doğrulayıcısını yalnızca hizmette kullanırız.
İstemcideki işlevsellik, CreditCardClientCredentials ve CreditCardClientCredentialsSecurityTokenManager sınıflarında CreditCardTokenProviderbulunur.
Hizmette, işlevsellik CreditCardServiceCredentials, CreditCardServiceCredentialsSecurityTokenManager, CreditCardTokenAuthenticator ve CreditCardTokenAuthorizationPolicy sınıflarında bulunur.
public class CreditCardClientCredentials : ClientCredentials
{
CreditCardInfo creditCardInfo;
public CreditCardClientCredentials(CreditCardInfo creditCardInfo)
: base()
{
if (creditCardInfo == null)
throw new ArgumentNullException(nameof(creditCardInfo));
this.creditCardInfo = creditCardInfo;
}
public CreditCardInfo CreditCardInfo
{
get { return this.creditCardInfo; }
}
protected override ClientCredentials CloneCore()
{
return new CreditCardClientCredentials(this.creditCardInfo);
}
public override SecurityTokenManager CreateSecurityTokenManager()
{
return new CreditCardClientCredentialsSecurityTokenManager(this);
}
}
public class CreditCardClientCredentialsSecurityTokenManager : ClientCredentialsSecurityTokenManager
{
CreditCardClientCredentials creditCardClientCredentials;
public CreditCardClientCredentialsSecurityTokenManager(CreditCardClientCredentials creditCardClientCredentials)
: base (creditCardClientCredentials)
{
this.creditCardClientCredentials = creditCardClientCredentials;
}
public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
{
// Handle this token for Custom.
if (tokenRequirement.TokenType == Constants.CreditCardTokenType)
return new CreditCardTokenProvider(this.creditCardClientCredentials.CreditCardInfo);
// Return server cert.
else if (tokenRequirement is InitiatorServiceModelSecurityTokenRequirement)
{
if (tokenRequirement.TokenType == SecurityTokenTypes.X509Certificate)
{
return new X509SecurityTokenProvider(creditCardClientCredentials.ServiceCertificate.DefaultCertificate);
}
}
return base.CreateSecurityTokenProvider(tokenRequirement);
}
public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
{
return new CreditCardSecurityTokenSerializer(version);
}
}
class CreditCardTokenProvider : SecurityTokenProvider
{
CreditCardInfo creditCardInfo;
public CreditCardTokenProvider(CreditCardInfo creditCardInfo) : base()
{
if (creditCardInfo == null)
throw new ArgumentNullException(nameof(creditCardInfo));
this.creditCardInfo = creditCardInfo;
}
protected override SecurityToken GetTokenCore(TimeSpan timeout)
{
SecurityToken result = new CreditCardToken(this.creditCardInfo);
return result;
}
}
public class CreditCardServiceCredentials : ServiceCredentials
{
string creditCardFile;
public CreditCardServiceCredentials(string creditCardFile)
: base()
{
if (creditCardFile == null)
throw new ArgumentNullException(nameof(creditCardFile));
this.creditCardFile = creditCardFile;
}
public string CreditCardDataFile
{
get { return this.creditCardFile; }
}
protected override ServiceCredentials CloneCore()
{
return new CreditCardServiceCredentials(this.creditCardFile);
}
public override SecurityTokenManager CreateSecurityTokenManager()
{
return new CreditCardServiceCredentialsSecurityTokenManager(this);
}
}
public class CreditCardServiceCredentialsSecurityTokenManager : ServiceCredentialsSecurityTokenManager
{
CreditCardServiceCredentials creditCardServiceCredentials;
public CreditCardServiceCredentialsSecurityTokenManager(CreditCardServiceCredentials creditCardServiceCredentials)
: base(creditCardServiceCredentials)
{
this.creditCardServiceCredentials = creditCardServiceCredentials;
}
public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
if (tokenRequirement.TokenType == Constants.CreditCardTokenType)
{
outOfBandTokenResolver = null;
return new CreditCardTokenAuthenticator(creditCardServiceCredentials.CreditCardDataFile);
}
return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
}
public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
{
return new CreditCardSecurityTokenSerializer(version);
}
}
class CreditCardTokenAuthenticator : SecurityTokenAuthenticator
{
string creditCardsFile;
public CreditCardTokenAuthenticator(string creditCardsFile)
{
this.creditCardsFile = creditCardsFile;
}
protected override bool CanValidateTokenCore(SecurityToken token)
{
return (token is CreditCardToken);
}
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token)
{
CreditCardToken creditCardToken = token as CreditCardToken;
if (creditCardToken.CardInfo.ExpirationDate < DateTime.UtcNow)
throw new SecurityTokenValidationException("The credit card has expired.");
if (!IsCardNumberAndExpirationValid(creditCardToken.CardInfo))
throw new SecurityTokenValidationException("Unknown or invalid credit card.");
// the credit card token has only 1 claim - the card number. The issuer for the claim is the
// credit card issuer
var cardIssuerClaimSet = new DefaultClaimSet(new Claim(ClaimTypes.Name, creditCardToken.CardInfo.CardIssuer, Rights.PossessProperty));
var cardClaimSet = new DefaultClaimSet(cardIssuerClaimSet, new Claim(Constants.CreditCardNumberClaim, creditCardToken.CardInfo.CardNumber, Rights.PossessProperty));
var policies = new List<IAuthorizationPolicy>(1);
policies.Add(new CreditCardTokenAuthorizationPolicy(cardClaimSet));
return policies.AsReadOnly();
}
/// <summary>
/// Helper method to check if a given credit card entry is present in the User DB
/// </summary>
private bool IsCardNumberAndExpirationValid(CreditCardInfo cardInfo)
{
try
{
using (var myStreamReader = new StreamReader(this.creditCardsFile))
{
string line = "";
while ((line = myStreamReader.ReadLine()) != null)
{
string[] splitEntry = line.Split('#');
if (splitEntry[0] == cardInfo.CardNumber)
{
string expirationDateString = splitEntry[1].Trim();
DateTime expirationDateOnFile = DateTime.Parse(expirationDateString, System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.AdjustToUniversal);
if (cardInfo.ExpirationDate == expirationDateOnFile)
{
string issuer = splitEntry[2];
return issuer.Equals(cardInfo.CardIssuer, StringComparison.InvariantCultureIgnoreCase);
}
else
{
return false;
}
}
}
return false;
}
}
catch (Exception e)
{
throw new Exception("BookStoreService: Error while retrieving credit card information from User DB " + e.ToString());
}
}
}
public class CreditCardTokenAuthorizationPolicy : IAuthorizationPolicy
{
string id;
ClaimSet issuer;
IEnumerable<ClaimSet> issuedClaimSets;
public CreditCardTokenAuthorizationPolicy(ClaimSet issuedClaims)
{
if (issuedClaims == null)
throw new ArgumentNullException(nameof(issuedClaims));
this.issuer = issuedClaims.Issuer;
this.issuedClaimSets = new ClaimSet[] { issuedClaims };
this.id = Guid.NewGuid().ToString();
}
public ClaimSet Issuer { get { return this.issuer; } }
public string Id { get { return this.id; } }
public bool Evaluate(EvaluationContext context, ref object state)
{
foreach (ClaimSet issuance in this.issuedClaimSets)
{
context.AddClaimSet(this, issuance);
}
return true;
}
}
Arayanların Bilgilerini Görüntüleme
Çağıranın bilgilerini görüntülemek için aşağıdaki örnek kodda gösterildiği gibi kullanın ServiceSecurityContext.Current.AuthorizationContext.ClaimSets . geçerli ServiceSecurityContext.Current.AuthorizationContext.ClaimSets çağıranla ilişkili yetkilendirme taleplerini içerir. Talepler, CreditCardToken sınıfı tarafından AuthorizationPolicies koleksiyonunda sağlanmaktadır.
bool TryGetStringClaimValue(ClaimSet claimSet, string claimType, out string claimValue)
{
claimValue = null;
IEnumerable<Claim> matchingClaims = claimSet.FindClaims(claimType, Rights.PossessProperty);
if (matchingClaims == null)
return false;
IEnumerator<Claim> enumerator = matchingClaims.GetEnumerator();
enumerator.MoveNext();
claimValue = (enumerator.Current.Resource == null) ? null :
enumerator.Current.Resource.ToString();
return true;
}
string GetCallerCreditCardNumber()
{
foreach (ClaimSet claimSet in
ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)
{
string creditCardNumber = null;
if (TryGetStringClaimValue(claimSet,
Constants.CreditCardNumberClaim, out creditCardNumber))
{
string issuer;
if (!TryGetStringClaimValue(claimSet.Issuer,
ClaimTypes.Name, out issuer))
{
issuer = "Unknown";
}
return $"Credit card '{creditCardNumber}' issued by '{issuer}'";
}
}
return "Credit card is not known";
}
Ö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.
Batch Dosyasını Ayarlama
Bu örnekte yer alan Setup.bat toplu iş dosyası, sunucu sertifika tabanlı güvenlik gerektiren IIS tarafından barındırılan uygulamayı çalıştırmak için sunucuyu ilgili sertifikalarla yapılandırmanıza olanak tanır. Bu toplu iş dosyası, bilgisayarlar arasında çalışacak veya barındırılmayan bir durumda çalışacak şekilde değiştirilmelidir.
Aşağıda, toplu iş dosyalarının farklı bölümlerine ilişkin kısa bir genel bakış sağlanır, böylece bunlar uygun yapılandırmada çalıştırılacak şekilde değiştirilebilir.
Sunucu sertifikası oluşturuluyor:
Toplu iş dosyasındaki
Setup.bataşağıdaki satırlar kullanılacak sunucu sertifikasını oluşturur.%SERVER_NAME%değişkeni sunucu adını belirtir. Kendi sunucu adınızı belirtmek için bu değişkeni değiştirin. Bu toplu iş dosyasında varsayılan değer localhost'tır. Değişkeni değiştirirseniz%SERVER_NAME%, Client.cs ve Service.cs dosyalarına gitmeniz ve localhost'un tüm örneklerini Setup.bat betiğinde kullandığınız sunucu adıyla değiştirmeniz gerekir.Sertifika,
LocalMachinemağaza konumu altındaki Kişisel (Kişisel) mağazada saklanır. Sertifika, IIS tarafından barındırılan hizmetler için LocalMachine deposunda depolanır. Kendi kendine barındırılan hizmetler için, LocalMachine dizesini CurrentUser ile değiştirerek istemci sertifikasını CurrentUser mağaza konumunda saklamak amacıyla toplu iş dosyasını değiştirmeniz gerekir.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 -peSunucu sertifikasını istemcinin güvenilen sertifika deposuna yükleme:
Setup.bat toplu iş dosyasındaki aşağıdaki satırlar sunucu 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.
echo ************ echo copying server cert to client's TrustedPeople store echo ************ certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleIIS tarafından barındırılan hizmetten sertifika özel anahtarına erişimi etkinleştirmek için, IIS tarafından barındırılan işlemin çalıştığı kullanıcı hesabına özel anahtar için uygun izinler verilmelidir. Bu, Setup.bat betiğindeki son adımlarla gerçekleştirilir.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Uyarı
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 dizini işaret eder.
Örneği ayarlamak ve derlemek için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Örneği aynı bilgisayarda çalıştırmak için
- Yönetici ayrıcalıklarıyla bir Visual Studio Komut İstemi penceresi açın ve ö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. Yolun, Makecert.exe bulunduğu klasörü içerdiğinden emin olun.
Uyarı
Ö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.
client\bin dizininden 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 bilgisayarda çalıştırmak için
Hizmet ikili dosyaları için hizmet bilgisayarında bir dizin oluşturun.
Hizmet programı dosyalarını hizmet bilgisayarındaki hizmet dizinine kopyalayın. CreditCardFile.txtkopyalamayı unutmayın; aksi takdirde, kredi kartı doğrulayıcısı istemciden gönderilen kredi kartı bilgilerini doğrulayamaz. Ayrıca Setup.bat ve Cleanup.bat dosyalarını hizmet bilgisayarına kopyalayın.
Bilgisayarın tam etki alanı adını içeren bir konu başlığına sahip bir sunucu sertifikanız olmalıdır. Değişkeni hizmetin barındırıldığı bilgisayarın tam adıyla değiştirirseniz
%SERVER_NAME%Setup.bat kullanarak bir tane oluşturabilirsiniz. Setup.bat dosyasının Yönetici ayrıcalıklarıyla açılan Visual Studio için Geliştirici Komut İstemi'nde çalıştırılması gerektiğini unutmayın.Sunucu sertifikasını istemcideki CurrentUser-TrustedPeople deposuna kopyalayın. Bunu yalnızca sunucu sertifikası güvenilen bir veren tarafından verilmediyse yapmalısınız.
EchoServiceHost.cs dosyasında, localhost yerine tam bilgisayar adı belirtmek için sertifika konu adının değerini değiştirin.
\client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci bilgisayara kopyalayın.
Client.cs dosyasında, uç noktanın adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin.
Client.cs dosyasında hizmet X.509 sertifikasının konu adını localhost yerine uzak konağın tam bilgisayar adıyla eşleşecek şekilde değiştirin.
İstemci bilgisayarda, komut istemi penceresinden Client.exe başlatın.
İstemci ve hizmet iletişim kuramıyorsa bkz. WCF Örnekleri için Sorun Giderme İpuçları.
Örnekten sonra temizlik yapmak için
- Örneği çalıştırmayı bitirdikten sonra örnekler klasöründe Cleanup.bat çalıştırın.