Güvenlik etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Güvenlik etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

27 Mayıs 2008 Salı

Web Servis, HTTP Authentication ve LDAP

NetBeans 6.1 ile Glassfish üzerinde geliştirilen web servisleri için HTTP authentication ve LDAP kullanmak istediğimizde yapmamız gerekenler şu şekildedir.

Öncelikle Glassfish Admin Console ile bir ldap realm tanımlıyoruz.

Admin console da Configuration > Security > Realms de New ile yeni bir Realm tanımla.
Name: ldapRealmName (herhangi birsey olabilir, web.xml de kullanılacak.)
ClassName: com.sun.enterprise.security.auth.realm.ldap.LDAPRealm

ClassName seçilince JAAS context otomatik olarak ldapRealm gelir.
Directory: ldap sunucu adresi
Base DN: cn=Users,dc=xxxx,dc=com,dc=tr

Ek olarak aşağıdakiler tanımlanır.
search-filter: sAMAccountName=%s
group-base-dn: cn=Groups, dc=xxxx,dc=com,dc=tr
search-bind-password: şifre
group-search-filter: member=%d
search-bind-dn: cn:Administrator,cn=Users,dc=xxxx,dc=com,dc=tr

Bu tanımladığımız ldap realm web.xml de login config ayarlarında kullanılacak.

Web servisinin geliştirildiği web uygulamasında yapılması gerekenler:
web.xml üzerinde yapmamız gereken eklemeler:


<security-constraint>

<display-name>MyConstraint</display-name>
<web-resource-collection>
<web-resource-name>myresource</web-resource-name>
<description/>
<url-pattern>/*</url-pattern>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description>MyDescription</description>
<role-name>AuthRole </role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ldapRealmName</realm-name>
</login-config>
<security-role>
<description/>
<role-name>AuthRole</role-name>
</security-role>

sun-web.xml üzerindeki değişiklikler:

<security-role-mapping>

<role-name>AuthRole </role-name>
<group-name>User</group-name>
</security-role-mapping>

Buradaki GrupAdı Ldap ta tanımlanan grup adı olmalıdır. Uygulamaya erişim için kullanılacak kullanıcılar bu grup üyesi olarak tanımlanmalıdır.

Bu web servisinin client ını yazarken, tek yapmamız gereken kullanıcı adı ve şifre göndermek. Web servisini çağırdığınız yere aşağıdaki kod parçasını ekleyebilirsiniz.
((BindingProvider)port).getRequestContext().put( BindingProvider.USERNAME_PROPERTY, "kullanıcıAdı");
((BindingProvider)port).getRequestContext().put( BindingProvider.PASSWORD_PROPERTY, "şifre");


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.