15 Mayıs 2008 Perşembe

C# ve .net ile secure web servisine client yazmak (bu cümle Türkçedir)

Sanki web servislerinde güvenliğe kimse ihtiyaç duymayacakmış gibi bu güvenlik konusunda hep workaround'lar ile çözüme ulaşılıyor. Sadece .net dünyasında değil, JAVA dünyasında da bu böyle... HTPP authentication isteyen güvenli bir web servisine ulaşmamız söz konusu ise .net'te şöyle yapmamız gerekiyor:

1. Web Referansımızı WSDL ile her zaman yaptığımız standar şekilde oluşturuyoruz. Diyelim ki web referansımızın adı WR, web servisimizin adı SERVIS olsun...

2. Güvenlik için sorulan http authentication bilgilerini wermek için .net tarafından oluşturulan proxy class'ın bir metodunu override etmemiz gerekecek. Bunu tabi ki üretilen proxy class'ın içinde de yapabiliriz ama herhangi bir update yaptığımızda kodumuzun silinmemesi için sub-classing yapmak daha doğru. Bu sebeple yeni bir class oluşturuyoruz.

3. Yeni oluşturduğumuz class'ın içine şu kodu yazıyoruz:

public class GuvenliServis : WR.SERVIS
{
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request;
request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":"+networkCredentials.Password);

request.Headers["Authorization"] ="Basic " + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
return request;
}
}


4. Artık web servisini kullandığımız kodumuz içinde proxy class'ı değil, yeni oluşturduğumuz sub-class'ı çağıracağız. Kullanıcı adı ve şifreyi de şöyle belirteceğiz:

GuvenliServis Gs = new SERVIS();
NetworkCredential netCredential = new NetworkCredential("", "<Şifre>");
Uri uri = new Uri(es.Url);
ICredentials credentials = netCredential.GetCredential(uri, "Basic");
Gs.Credentials = credentials;
Gs.PreAuthenticate = true;
Gs.<ÇağırmakİstediğinizMetod>();

Bu arada giden gelen SOAP mesajlarını kontrol etmek için YATT isimli araç kullanılabilir.