Mar 17
Digg
Stumbleupon
Technorati
Delicious

Free ASP.NET 2.0 Web Hosting

SOMEE.COM is offering FREE Web Hosting Service for ASP.NET 2.0 developers. You can have 105 MB web space and 3 GB Monthly bandwidth. ( You can check the detail in the pic below) .

All you need to do to get a free account is very simple. Just submit some of your information in their sign up page. Then, you will get the Free Account that you can upload your ASP.NET 1.1 or 2.0 project.

somee-free-hosting.PNG

URL: https://somee.com/FreePackage.aspx

Of course, There are some rules for using this *Free* Package.

  • Our web service can not be used as file storage.
  • Our web service can not be used as a source of images and or media for other sites (hot linking).
  • Adult or illegal content is not allowed.
  • Web site can not contain viruses of any kind.
  • You are not allowed to hide our advertisiment.
  • Web site must be visited at least 10 times per month.

If you are okay with these rules, just go and get an account here.

Note: The main advantage of having a free hosting is that you may have some understanding of how to manage/maintain a website. The most of people, even web developers, do not have that much experience in managing a “Live Website” because we, web developers, are just enjoying with localhost, internal web service and SQL/Database Server within our LAN. :)

UPDATE:

Mar 17
Digg
Stumbleupon
Technorati
Delicious

Getting All Users Information from Domain in ASP.NET

Step #1: Disable “Anonymous Access” of Virtual Directory

  1. Open Internet Information Service (IIS)
  2. Go to “Properties of your Virtual Directiory”
  3. Go to “Directory Security” tab
  4. Click “Edit” button of “Anonymous access and autherntication control”
  5. Uncheck “Anonymous access”

Step #2: Enabled impersonating in Web.Config
Add the tag below under in Web.config.

<identity impersonate="true"/>

Step #3: Adding “System.Directory.Services” dll as reference

System.Directory.Services

Open ASP.NET Web project. And add this dll to your project.

Step #4: Put the following code in PageLoad

Code for getting all users from domain

try
{
   DirectorySearcher  searcher=new DirectorySearcher();
   string rootDSE=searcher.SearchRoot.Path;

   DirectoryEntry entry = new DirectoryEntry(rootDSE); //eg: Default Domain
   DirectorySearcher dirSearcher = new DirectorySearcher(entry);
   dirSearcher.Filter = "(&(objectClass=user))";
   dirSearcher.SearchScope=SearchScope.Subtree;
   dirSearcher.Sort.Direction=System.DirectoryServices.SortDirection.Ascending;
   dirSearcher.Sort.PropertyName="cn";

   ArrayList domainMembers = new ArrayList();

   //Finding all users.
   foreach(SearchResult result in dirSearcher.FindAll())
   {
     try
     {
	string strUserInfo = string.Empty;
        DirectoryEntry de=result.GetDirectoryEntry();

	if(de.Properties.Contains("sAMAccountName"))
	  strUserInfo = de.Properties["sAMAccountName"].Value.ToString();

        domainMembers.Add(strUserInfo);
     }
     catch(Exception ex)
     {
	Console.WriteLine(ex.Message);
     }
   }
     DataGrid1.DataSource = domainMembers;
     DataGrid1.DataBind();
}
catch(Exception ex)
{
   Console.WriteLine(ex.Message);
}

You might get the following errors.

  1. An operations error occurred
  2. The specified domain either does not exist or could not be contacted

If you are getting these errors above, please make sure that you have permission to access your domain.

Sub 20
Digg
Stumbleupon
Technorati
Delicious

Sitenizin host edildiği firmanın ASP.NET trust level ını bulmak

Bazen host firmamızın ASP.NET trust level ını bilmeden yazdığımız kodlar ilerde başımıza dert açabiliyor(ki başıma geldi :D).
Bunun için hostumuzun ASP.NET trust level ını bulup ona göre kodları yazmak en mantıklı tercih olmalıdır. Basit olarak ASP.NET trust level ı öğrenmemizi sağlayan kod parçası:
AspNetHostingPermissionLevel GetCurrentTrustLevel() {
    foreach (AspNetHostingPermissionLevel trustLevel in
            new AspNetHostingPermissionLevel [] {
                AspNetHostingPermissionLevel.Unrestricted,
                AspNetHostingPermissionLevel.High,
                AspNetHostingPermissionLevel.Medium,
                AspNetHostingPermissionLevel.Low,
                AspNetHostingPermissionLevel.Minimal 
            } ) {
        try {
            new AspNetHostingPermission(trustLevel).Demand();
        }
        catch (System.Security.SecurityException ) {
            continue;
        }
 
        return trustLevel;
     }
 
     return AspNetHostingPermissionLevel.None;
}
 
Sub 19
Digg
Stumbleupon
Technorati
Delicious

Disk Output Cache

Scoot Cate in CodePlex de başlattığı Disk Output Cache projesi gerçekten ilgi çekici bir işe benziyor.
Oca 9
Digg
Stumbleupon
Technorati
Delicious

Custom Configuration Section

Basit olarak isim-değer ikililerini web.config içinde <appSettings/> içinde tutabiliyoruz fakat ya daha komplike konfigürasyon senaryolarını kullanmak istediğimizde ne kullanmalıyız. Mesela bir nesneye ait çok fazla sayıda parametreyi tutmamız ya da bir olaylar listesini tutmamız gerektiğinde ne olacak?Böyle durumlar için  <appSettings/> ihtiyaçlarımızı karşılamayacaktır. Bu durumda da daha komplike verileri tutarken  özel konfigürasyon ayarları tanımlamamız gerekmektedir.

web.config dosyasındaki herbir configuration section, kendisine ait olan veriyi okuyacak ve beraberinde bir nesne döndürecek bir configuration section handler a sahiptir. Bu configuration section lar ve onların handler ları <configSection> tag ları arasında tanımlanmalıdır.  


Örnekte machine.config dosyasında tanımlanmış <appSettings> görebilirsiniz.
<section> elementinde name parametresi konfigürasyon dosyasında kullanılacak görünür ismi tanımlamak için kullanılır, type parametresinde ise veriyi okuyup nesne olarak döndürecek olan configuration section handler tanımlanır.

web.config dosyasında tanımlı olan tüm section lar,  web.config dosyasının miras aldığı machine.config dosyasında tanımlanmıştır.

Bize özel configuration section oluştururken neler yapmalıyız?
  1. Konfigürasyon bilgilerinizi tutacağınız bir data yapısı tanımlamalısınız.
  2. Veriyi okuyup onu yukarda tanımlanan data yapısı olarak geri döndürecek, IConfigurationSectionHandler in uygulandığı bir class oluşturun.
  3. web.config dosyanızda <configSection> tanımlayın. Burada yeni ayarlarınız için kullanacağınız ad ve yukarda oluşturulan handler ı tanımlayın.(<section name="" type="")
  4. Konfigürasyon ayarlarınızı yeni oluşturduğunuz section da tanımlayın.
  5. ConfigurationManager sınıfının GetSection metoduna tanımladığınız section ın adını parametre olarak verip, tanımladığınız handler vasıtası ile konfigürasyon ayarlarınızı gene tanımladığınız data yapısı formatında geri döndürün.

 Basit olarak genel kullanımın uygulandığı bir örnek yapalım;örneğimizde uygulamalarımız içinde kullanacağımız smile icon larının tanımlandığı özel bir section oluşturalım.

web.config dosyasında kullanmak istediğimiz format bu şekilde. Icon ların imageUrl ile tutuldukları yolu, key ile de uygulama içinde bu icon lar yerine kullanacağımız anahtar kelime tanımlanmaktadır.
İlk olarak bu veriyi tutacak bir yapı oluşturalım
  

SmilesItem basit, iki tane public özelliğe sahip bir sınıf. ImageUrl resim yolunu, Key ise icon için belirlenen anahtar kelimeyi tutar. Şimdi bize birden fazla SmilesItem nesnesini tutmak için bir koleksiyon gereklidir.
SmilesItemCollection sınıfına ICollection<> interface ini uyguluyoruz. GetSmile() fonksiyonu ile koleksiyon da verilen anahtar kelime ile uyuşan icon olup olmadığına bakıyoruz eğer varsa eşleşen nesne geri döndürülüyor ve de default bir property tanımlıyoruz GetSmile den dönen veriyi tutmak için.
Sıra, konfigürasyon dosyasından veriyi okuyup nesne olarak döndürecek sınıfa geldi.

SmilesConfigurationHandler sınıfında dikkat edilmesi gereken husus IConfigurationSectionHandler interface inin uygulanmasıdır. Interface uygulandıktan sonra burada tanımlı olan tek fonksiyon olan Create metodu ile özel tanımlanan ayarların tutulduğu SmilesItemCollection sınıfı döndürülür.
XmlNodeList smileNodes = section.SelectNodes("smile"); XmlNode nesnesinin SelectNodes methodu parametre olarak Xpath sorgusu kabul etmektedir ve bunun sonucunda da eşleşen node lara XmlNodeList olarak geri döndürmektedir. Bu tanımlamadan sonra alınan herbir node da belirtilen özelliklerin okunup bunları yeni bir SmilesItem nesnesi haline dönüştürmektir.
smile.Attributes.GetNamedItem("imageUrl").Value.ToString()

Bütün bu işlemlerden sonra projeyi derleyip oluışan .dll dosyasını kullanmak istediğimiz web uygulamasına referans olarak ekleyelim. İlk önce web.config dosyamız bu özel section ın tanımlamasını yapmalıyız.


eğer web.config dosyalarınızda <configSection> kullanacaksanız bunun mutlaka <configuration> section ınında tanımlanmış olan ilke özellik olmasına compilation error almamak için dikkat edin.

name="görümesi istenen section adı" type="NameSpace.Type, Assembly"

Sırada bu oluşturulan ayarlara uygulama içinden erişime geldi. Bunun için diğer web.config ayarlarınada ulaşabileceğim ve bana kolaylık sağlayacak bir class tanımlayacağım.


tanımlanan ConfigurationManager classının GetSection methodu ile tanımladığımız custom section içeriği alınıyor ve SmilesItemCollection olarak geri döndürülüyor.
Uygulama içinde;
SmilesItem item=Config.Smiles["anahtarKelime"]; verilen anahtar kelime ile eğer eşleşen bir icon varsa nesne olarak döndürülüyor. 
ve icon resminide item.ImageUrl.ToString() ile alabiliyoruz.
Oca 9
Digg
Stumbleupon
Technorati
Delicious

Site Navigation Security

Asp.Net 2.0,  navigation data ile çalışan TreeView ve Menu gibi yeni navigation kontrollere sahiptir. Kullanılan navigation data lardan biri de 2.0 ile birlikte gelen SiteMapProvider lardır. Asp.Net içinde işlevini tam anlamıyla yerine getiren SiteMapProvider XmlSiteMapProvider dır. Görevi xml formatında olan .sitemap dosyasını parse ederek Menu gibi navigation kontrolleri için bağlantılı SiteMapNode lar oluşturarak veriyi bu kontroller tarafından render edilebilecek hale sokmaktır. Site Navigation a bir de güvenlik açısından bakarsak; navigation data olarak .sitemap dosyasına girilen veriler sitenizin hiyerarşisinin nerdeyse bir aynası konumundadır. İlk potansiyel tehlike navigation kontrolünün linkleri sayfaya render ederken ortaya çıkar. Oluşturulan linklerin normal olarak kullanıcı tarafından erişilmez olması istenecektir. Bununla birlikte yetkisiz kullanıcıların da bazı sayfalara erişimleri engellenmek istenecektir. Kısacası bazı linklerin ilk yüklenimde görünür olmaması yetkisiz erişim için şarttır.

SiteMapProvider base class ı güvenlik düzenleme(security trimming) özelliğine sahiptir. Eğer bu özellik geçerli(açık) konuma getirilirse SiteMapProvider ilk önce mevcut kullanıcılar için kullanılabilir linkleri geri döndürür. Güvenlik düzenleme özelliğini securityTrimmingEnabled (default olarak false) özelliğini true yaparak kullanabilirsiniz.



Güvenlik düzenleme özelliği aktif hale getirildiği zaman  SiteMapProvider classı içinden .IsAccesibleToUser methodu çağrılmakta ve her bir node un aktif kullanıcı tarafından kullanılabilirliği denetlenmektedir. Eğer kontrol edilen URL aktif kullanıcı tarafından erişilemez ise SiteMapNode pas geçilmekte ve o kullanıcı için geri döndürülmemektedir.

IsAccessibleToUser, çalışma mantığı olarak arka planda yetkilendirme işlemleri için UrlAuthorizationModule ve FileAuthorizationModule ü kullanmaktadır.Opsiyonel olarak da .sitemap dosyası içinde tanımlanan siteMapNode içinde roles özelliği ile de rol yönetimini gerçekleştirir. authorization configuration elementi ile belirlenen yetkilendirme kuralları sadece sizin web uygulamanız içindeki olaylarda gerçeklenir. SiteMapNode class ı ise özel URL le ler için spesifik rol tanımlamaları gerçekleyebilir. Örneğin .sitemap dosyanızın içinde sizin uygulamanız dışında bir yere link veriliyor, bu link uygulama dışında olduğundan authorization kurallarını pas geçecek ve kullanıcının erişimine sunulacaktır. Bu tür linkler için siteMapNode içinde roles özelliği ile bir veya birden fazla rolleri belirterek gerekli yetkilendirmeyi sağlayabiliriz.


SiteMapNode lar için role tanımlamanın diğer bir gerekliliği ise tüm menü içeriğinin uygulama içinde gösterilmek istenmemesidir. Örneğin menünüz içinde bir başlık ve ona ait alt linkleriniz var;


Burda dikkat edilmesi gereken husus üst node a role tanımlanmışken neden alt node larada aynı role tanımlaması yapıldığıdır. Sebebi Site Navigation un henüz bir role miras alma(inheritance) özelliğine sahip olmamasıdır. Role tanımlaması yönetim sayfası bazı yapıldığında, bu rol tanımlaması alt node lara da yapılmalıdır. Eğer alt node lara rol tanımlaması yapılmazda kullanılan methodlara bağlı olarak tutarsız sonuçlar meydana gelebilir. Örneğin ana node asla render edilmeyebilir ve olayı hataya sürükleyebilir, role tanımlaması yapılmamış alt node lara FindSiteMapNode ile erişim sağlanabilir...

IsAccessibleToUser çalışma aşamaları;
  1. .sitemap dosyası içinde roles tanımlaması yapılmışsa provider her bir node ve role için HttpContext.Current.User.IsInRole methodunu çağırır. Eğer kullanıcı role lerde belirlenen herhangibir role içine dahilse provider SiteMapNode ları görünür olarak geri döndürecektir.
  2. roles özelliğine "*" verilmişse tüm kullanıcılar tüm node ları görme yetkisine sahiptir.
  3. Eğer sitemap node içinde hiçbir URL yoksa ve  mevcut kullanıcının role ü, roles içinde tanımlanmamış ise kullanıcı o node u görmeye yetkisizdir. Buna dayanarak da provider null değer döndürecek ya da o node u pas geçerek sonuca yansıtmayacaktır. Dikkat edilmesi gereken bir husus da yukardaki örnekde olduğu gibi(yönetim sayfası ve alt sayfaları) eğer üst node a rol tanımlayıp alt node lara rol tanımlamazsanız tutarsız bir tavır sergileneceğinden tüm kullanıcılarınız bu durumdan etkilenecek ve hiçkimsenin node u görme izni olmayacaktır(tabi securityTrimmingEnabled=true olduğu sürece).
  4. Eğer roller eşleşmemiş veya roles özelliği tanımlanmamış ve de node bir URL içeriyorsa, provider eğer "Windows authentication" aktif halde ise FileAuthorizationModule ü çağıracaktır. FileAuthorizationModule methodu oturumdaki WindowsIdentity i kontrol edecek yetkilendirme gerçekleşirse node da belirtilen dosya yolu geri döndürülecektir.
  5. Eğer dosyanın yetkilendirmesi gerçekleşmez veya "Windows authentication" aktif halde değilse bu sefer provider UrlAuthorizationModule methodunu çağıracak web.config dosyasında authorization altında belirtilen kurallar doğrultusunda yetkiledirme yapılacak ve ona göre node geri döndürülecektir.
  6. Yukardaki tüm aşamaların başarısızlığa uğradığında ise, kullanıcının o node u görme konusunda hiçbir yetkisinin olmadığını ve bunun sonucunda da provider dan null bir değer döndüğünü veya provider ın SiteMapNode ları döndürmeyi bıraktığını söyleyebiliriz.

Bütün bunların yanında güvenlik düzenleme(security trimming) özelliğinin aktif hale getirilmesi;

  • node lara roles atansa bile file ve URL yetkilendirmelerini geçeceği için başarısız sonuçlanabilir.
  • uygulamada çok fazla node olduğunu varsayarsak bu her bir node un kontrolü, yüksek CPU kullanımı ve beraberinde de uygulamanın ciddi bir performans sorunu yaşamasını sağlayacaktır.
  • eğer uygulamanızda bir kök node var ve bunun altındaki node larda roles tanımlı ve de siz bu kök node un gösterimini istemiyorsanız roles özelliğine "*" atamalısınız.

 

XmlSiteMapProvider provider ınızın yalnızca roles özelliğini denetlemesini istiyorsanız yapmanız gereken XmlSiteMapProvider  den türetilmiş bir nesne ve IsAccessibleToUser methodunu override etmek.

 

 Bütün bunlar hala sayfanızın güvenli olduğunu göstermez yapılan işlemle yetkilendirme verilen linkler sadece gizlenmiştir eğer kullanıcı bunları biliyorsa browser ına yazıp rahatça erişim sağlayabilecektir. Eğer bu tarz özel bir provider kullanırsanız file ve URL yetkilendirmeleri denetlenmesi pas geçileceği için ciddi bir performans artışı sağlanabilir fakat güvenli bir uygulama için sayfa güvenliğine file ve URL yetkilendirmelerinin yapıldığına emin olun.