30 Mayıs 2012 Çarşamba

C# ile Membership

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile uygulamalarımızda kullanıcı kimlik doğrulama ve yetkilendirme işlemlerini yönetmek için kullandığımız Membership özelliğini yakından inceleyeceğiz. Membership, kullanıcıları kaydetme, oturum açma, şifreleri yönetme ve rolleri belirleme gibi işlemleri kolaylaştıran bir dizi araç sunar.

Membership Nedir?

Membership, .NET Framework'ün bir parçası olarak gelen ve web uygulamalarında kullanıcı yönetimi için standart bir çözüm sunan bir sistemdir. Bu sistem, geliştiricilerin kullanıcı kimlik doğrulama ve yetkilendirme işlemlerini güvenli ve verimli bir şekilde gerçekleştirmesine yardımcı olur.

Membership Kurulumu

Membership'i kullanabilmek için öncelikle veritabanında gerekli tabloların ve stored procedure'lerin oluşturulması gerekir. Bu işlem için aspnet_regsql aracı kullanılır.

1. Visual Studio Command Prompt'u Açın

Başlat menüsünden aşağıdaki yolu izleyerek Visual Studio Command Prompt'u açın:

Başlat -> Programlar -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010)

Bu, genellikle aşağıdaki gibi bir yolda bulunur:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010\Visual Studio Tools
C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat
2. aspnet_regsql Aracını Çalıştırın

Komut satırına aspnet_regsql yazıp Enter tuşuna basın. Bu komut, Membership ile ilgili veritabanı nesnelerini oluşturmak için bir kurulum sihirbazı başlatır. Sihirbazı takip ederek gerekli adımları tamamlayın. Bu sihirbaz, hangi veritabanına bağlanacağınızı ve hangi özelliklerin (Membership, Role Management, Profile vb.) kurulacağını seçmenizi isteyecektir.

Web.config Dosyasında Yapılandırma

Membership'i kullanabilmek için uygulamanızın web.config dosyasına (veya Windows Forms uygulamaları için app.config dosyasına) bazı yapılandırmalar eklemeniz gerekir. Bu yapılandırmalar, Membership sisteminin hangi sağlayıcıyı kullanacağını ve bu sağlayıcının ayarlarını belirtir.

1. Bağlantı Dizesini Ayarlayın

web.config dosyasında <connectionStrings> bölümüne veritabanı bağlantı dizesini ekleyin:

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.;Initial Catalog=YourDatabaseName;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <!-- Diğer yapılandırmalar -->
</configuration>
2. Membership Sağlayıcısını Yapılandırın

<system.web> bölümünde <membership> ve <providers> bölümlerini ekleyerek varsayılan sağlayıcıyı (genellikle SqlMembershipProvider) yapılandırın. Bu kısım, kullanıcının şifre gereksinimleri, başarısız giriş denemeleri gibi güvenlik ayarlarını da içerir.

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.;Initial Catalog=YourDatabaseName;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <!-- Membership yapılandırması -->
    <membership defaultProvider="SqlProvider">
      <providers>
        <add name="SqlProvider"
              type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers"
              connectionStringName="DefaultConnection"
              enablePasswordRetrieval="false"
              enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              requiresUniqueEmail="true"
              maxInvalidPasswordAttempts="5"
              minRequiredPasswordLength="6"
              passwordAttemptWindow="10"
              applicationName="/" />
      </providers>
    </membership>
    
    <!-- Rol yönetimi için de benzer bir yapılandırma gerekebilir -->
    <roleManager enabled="true" defaultProvider="SqlRoleProvider">
      <providers>
        <add name="SqlRoleProvider"
             type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers"
             connectionStringName="DefaultConnection"
             applicationName="/" />
      </providers>
    </roleManager>

    <!-- Diğer sistem.web yapılandırma ayarları -->
  </system.web>
</configuration>

Not: .NET Framework 4 ve sonrası için System.Web.Providers kullanılıyorsa, bu sağlayıcıyı NuGet paket yöneticisi aracılığıyla projenize eklemeniz gerekebilir.

Membership Sınıfını Kullanma

Kullanıcı yönetimi ile ilgili işlemleri gerçekleştirmek için System.Web.Security ad alanında bulunan Membership sınıfını kullanırız. Bu sınıf, statik metotlar ve özellikler sunar.

Yeni Kullanıcı Oluşturma
using System;
using System.Web.Security; // Membership için

public class UserManager
{
    public void CreateNewUser(string username, string password, string email)
    {
        MembershipCreateStatus status;
        // Kullanıcı oluşturma
        MembershipUser newUser = Membership.CreateUser(username, password, email, null, null, true, out status);

        if (status == MembershipCreateStatus.Success)
        {
            Console.WriteLine("Kullanıcı '{0}' başarıyla oluşturuldu.", username);
        }
        else
        {
            Console.WriteLine("Kullanıcı oluşturulurken hata oluştu: {0}", status.ToString());
        }
    }
}
Kullanıcı Girişi Doğrulama
using System;
using System.Web.Security;

public class UserManager
{
    public bool ValidateUserLogin(string username, string password)
    {
        // Kullanıcı adı ve şifreyi doğrula
        bool isValid = Membership.ValidateUser(username, password);
        if (isValid)
        {
            Console.WriteLine("Kullanıcı '{0}' başarıyla doğrulandı.", username);
            // FormsAuthentication.SetAuthCookie(username, false); // Web uygulamaları için oturum açma
            return true;
        }
        else
        {
            Console.WriteLine("Kullanıcı adı veya şifre yanlış.");
            return false;
        }
    }
}
Oturum Açmış Kullanıcı Bilgilerini Alma
using System;
using System.Web.Security;

public class UserManager
{
    public void GetCurrentUserInfo()
    {
        // Oturum açmış kullanıcıyı al
        MembershipUser currentUser = Membership.GetUser();

        if (currentUser != null)
        {
            // Kullanıcının benzersiz kimliği (GUID olarak)
            Guid userKey = new Guid(currentUser.ProviderUserKey.ToString()); // Örnekte belirtilen kullanım

            Console.WriteLine("Oturum Açan Kullanıcı Bilgileri:");
            Console.WriteLine("Kullanıcı Adı: " + currentUser.UserName);
            Console.WriteLine("E-posta: " + currentUser.Email);
            Console.WriteLine("Son Aktivite Tarihi: " + currentUser.LastActivityDate);
            Console.WriteLine("Benzersiz Kimlik (GUID): " + userKey.ToString());
        }
        else
        {
            Console.WriteLine("Herhangi bir kullanıcı oturum açmamış.");
        }
    }
}
Kullanıcı Şifresini Sıfırlama
using System;
using System.Web.Security;

public class UserManager
{
    public void ResetUserPassword(string username, string passwordAnswer)
    {
        try
        {
            // Şifre sıfırlama sorusunu kullanarak şifreyi sıfırla
            string newPassword = Membership.ResetPassword(username, passwordAnswer);
            Console.WriteLine("Kullanıcı '{0}' için yeni şifre: {1}", username, newPassword);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Şifre sıfırlanırken hata oluştu: " + ex.Message);
        }
    }
}

Rol Yönetimi

Membership sistemi, kullanıcıları rollere atayarak yetkilendirme işlemlerini kolaylaştırır. Rol yönetimi için System.Web.Security.Roles sınıfını kullanırız.

Rol Oluşturma
using System;
using System.Web.Security;

public class RoleManager
{
    public void CreateNewRole(string roleName)
    {
        if (!Roles.RoleExists(roleName))
        {
            Roles.CreateRole(roleName);
            Console.WriteLine("Rol '{0}' başarıyla oluşturuldu.", roleName);
        }
        else
        {
            Console.WriteLine("Rol '{0}' zaten mevcut.", roleName);
        }
    }
}
Kullanıcıyı Role Ekleme
using System;
using System.Web.Security;

public class RoleManager
{
    public void AddUserToRole(string username, string roleName)
    {
        if (Membership.GetUser(username) != null && Roles.RoleExists(roleName))
        {
            Roles.AddUserToRole(username, roleName);
            Console.WriteLine("Kullanıcı '{0}' '{1}' rolüne eklendi.", username, roleName);
        }
        else
        {
            Console.WriteLine("Kullanıcı veya rol bulunamadı.");
        }
    }
}
Kullanıcının Rolünü Kontrol Etme
using System;
using System.Web.Security;

public class RoleManager
{
    public bool IsUserInSpecificRole(string username, string roleName)
    {
        bool isInRole = Roles.IsUserInRole(username, roleName);
        if (isInRole)
        {
            Console.WriteLine("Kullanıcı '{0}' '{1}' rolünde.", username, roleName);
        }
        else
        {
            Console.WriteLine("Kullanıcı '{0}' '{1}' rolünde değil.", username, roleName);
        }
        return isInRole;
    }
}
Sayfaya Yetki Verme (Web.config için)

Web uygulamalarında, belirli sayfalara veya dizinlere erişimi roller üzerinden kontrol etmek için web.config dosyasındaki <authorization> bölümünü kullanırız. Bu, kod yazmadan yetkilendirme sağlamanın güçlü bir yoludur.

<configuration>
  <system.web>
    <!-- ... diğer yapılandırmalar ... -->
    <authorization>
      <!-- Tüm kullanıcılara varsayılan olarak erişim izni ver -->
      <allow users="*" />
    </authorization>
  </system.web>

  <!-- "AdminSayfasi.aspx" sayfasına sadece "Admin" rolündeki kullanıcıların erişmesine izin ver -->
  <location path="AdminSayfasi.aspx">
    <system.web>
      <authorization>
        <allow roles="Admin"/> <!-- "Admin" rolündekilere izin ver -->
        <deny users="*"/>    <!-- Diğer tüm kullanıcılara erişimi engelle -->
      </authorization>
    </system.web>
  </location>

  <!-- "Yonetim" klasöründeki tüm sayfalara sadece "Editor" ve "Admin" rollerindeki kullanıcıların erişmesine izin ver -->
  <location path="Yonetim">
    <system.web>
      <authorization>
        <allow roles="Editor,Admin"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

Önemli Not: Yetkilendirme kurallarında, allow (izin ver) ve deny (engelle) kuralları yukarıdan aşağıya doğru işlenir. İlk eşleşen kural uygulanır. Eğer bir rol için allow kuralı varsa ve daha sonra genel bir deny users="*" kuralı varsa, allow kuralı öncelikli olacaktır.

---

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile Membership sisteminin temel kavramlarını, kurulumunu ve kullanımını detaylı bir şekilde ele aldık. Membership, web uygulamalarında kullanıcı yönetimi, kimlik doğrulama ve yetkilendirme işlemlerini kolaylaştıran güçlü ve standart bir çözümdür. Umarım bu bilgiler, C# .NET Framework 4 ile uygulamalar geliştirirken size yardımcı olur. Bir sonraki yazımda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz. Webkolog.net'i takipte kalın!

Hepinize güvenli ve başarılı geliştirme süreçleri dilerim!

0 yorum:

Yorum Gönder