Ana içeriğe atla

ASP.NET Web Ortamında Active Directory İşlemleri

Bu makalemizde ASP.NET projelerinde, active directory’ye ulaşılırak yapılan bazı işlemler üzerinde duracağız;
  • Web projesinin client’ının açıldığı bilgisayarda açık olan account sahibinin kullanıcı adı ve bağlı olduğu domain alınabilir.
  • Bir active directory’den kullanıcı adı ile kullanıcının grupları ve bazı bilgileri alınabilir.
  • Kullanıcı adı, şifresi ve domain biliniyorsa bu bilgilerin doğruluğu active directory’ye login olmaya çalışılarak kontrol edilebilir.
Bu işlemler için bazı referansları projeye eklememiz ve dll’leri kullanmamız gerekmektedir. İlk olarak account’tan kullanıcı ismi ve domain adı alma ve sonrasında bu kullanıcının active directory gruplarını alma işlemine göz atacağız:
İlk olarak proje referanslarına System.DirectoryServices eklenir:

image
Şekil 1. Referans eklenmesi
Daha sonra “System.DirectoryServices” active directory’ye erişilecek sınıf içerisinden import edilir:
Imports System.Security.Principal
Imports System.Security.Permissions
Imports System.Runtime.InteropServices
Imports System.DirectoryServices
Domain’e bağlı olan kullanıcı ismi ve domain adı aşağıdaki şekilde alınabilir:

strDomainAndUser = My.User.CurrentPrincipal.Identity.Name.ToString
My.User.CurrentPrincipal.Identity.Name


içerisinden dönen string “domain/username” şeklinde olur, mesela; “univera/nimet.sozeri”.

Web projemizin virtual directory özellikleri ve Web.Config içeriği kullanıcı ismini alabilmek için ayarlanmalıdır; Virtual directory özelliklerinden “Directory Security” tabı altındaki “Anonymous access and authentication control” kısmındaki “Edit” butonu ile açılan “Authentication Methods” penceresinde anonymous access seçeneği işaretlenmemiş olmalıdır. Bu şekilde domain’e bağlanmış olan kullanıcı adı ve bağlı olduğu domain adı alınabilir.
image
Şekil 2. Authentication mode ayarlanması
Ayrıca Web.Config içerisinde “authentication” elemanının mode özelliği “Forms” olmamalıdır. Bu özellik de “Windows” olarak değiştirilmelidir.
<authentication mode="Windows"/>      
Kullanıcı adı alındıktan sonra da active directory’de kullanıcının dahil olduğu gruplar “DirectoryServices”a ait olan “DirectoryEntry”, “DirectroySearcher” sınıfları kullanılarak alınabilir:
Dim objRsl As SearchResult
Dim objDE As New DirectoryEntry(LDAP://DC=Univera,DC=NET)
Dim objSrc As New DirectorySearcher(objDE)
objSrc.Filter = String.Format("(SAMAccountName={0})", userName)objSrc.PropertiesToLoad.Add("memberOf")
objRsl = objSrc.FindOne()
If Not objRsl Is Nothing Then
      For i = 0 To objRsl.Properties("memberOf").Count – 1
                   ‘memberOf özelliğinden gruplar alınıp amaca uygun işleme katılır
      Next
End If
SearchResult nesnesinin içerisinden memberOf değerleri alınabilir ve kullanıcının grupları bu şekilde belirlenebilir. Kullanıcının active directory gruplarını alabilmek için de Web.Config’te bir özellik uyarlanmalıdır; identity elemanının impersonate özelliği “True” olarak belirlenmelidir:
<identity impersonate="true"  />

Son olarak kullanıcı adı, domain adı ve şifre elimizde varsa bu değerlerin active directory’den kontrol edilmesi işlemini inceleyelim. Bu işlem için de “C:\WINDOWS\system32” altından “advapi32.dll” alınıp projeye eklenir.
image
Şekil 3. Advapi32.dll’in projeye eklenmesi
Kod içerisinden bu dll daha sonra import edilerek kullanılacak fonksiyonlar belirtilir.
<DllImport("advapi32.dll")> _
         Private Shared Function LogonUser(ByVal _
         lpszUsername As String, ByVal lpszDomain _
            As String, ByVal lpszPassword As String, _
            ByVal dwLogonType As Integer, _
            ByVal dwLogonProvider As Integer, _
            ByRef phToken As Integer) As Boolean
End Function
Biz burada “LogonUser” fonksiyonunu kullanacağız. Bu fonksiyon ile bir kullanıcı adı, domain adı ve şifrenin active directory’ye login olup olmadığı kontrol edilir, sonuçta login işlemi başarılı ise “True” olarak boolean değer döner.
Dim objAd As New AD
If objAd.LogOnToActiveDirectory("nimet.sozeri", "Univera", "Sifre") Then
         Label1.Text = "Kullanıcı 'nimet.sozeri' ile 'Univera' domain'ine log in olunabildi!"
End If
Nimet SÖZERİ

Yorumlar

  1. Öncelikle örnek için sağolun. Sorum şu;
    Active Directory ile kullanıcın logonhours unu nasıl değiştirebilirim, teşekkürler.

    YanıtlaSil
  2. Yorumunuz için teşekkürler,
    Active Directory'de logonHours'u değiştirmek üzerine deneyimim yok, bunu yapabilmek için Active Directory'de admin olmak gerekiyor, bu nedenle ben yazdığım kodlarda yetki ile ilgili hata alıyorum, ancak sizin deneme şansınız varsa vereceğiniz mail adresine çalıştırmayı denediğim kodları gönderebilirim.

    YanıtlaSil
  3. Merhaba makale için sağolun gerçekten işime yaradı.Web uygulamasında domaine login olan kullanıcının bilgisini alabilirmiyim acaba.Web sayfasının çağaran kullanıcının windows login bilgisi

    YanıtlaSil
  4. Teşekkürler, işinize yaradığına sevindim,
    Domain'e login olup da web sayfasını çağıran kullanıcının domain ve kullanıcı bilgisi My.User.CurrentPrincipal.Identity.Name özelliği kullanılarak alınabilir.
    My.User.CurrentPrincipal.Identity.Name.ToString() ile dönen string içerisinde domain ve kullanıcı bilgisini bulabiliriz.
    "domain/username" şeklinde gelen string parse edilerek bu iki bilgi alınabilir.

    Dim UserDomain() As String = Split(My.User.CurrentPrincipal.Identity.Name.ToString(), "\")
    Dim username As String = strUserDomain(1)

    yukarıdaki şekilde username değişkenine kullanıcı bilgisini atabiliriz.

    YanıtlaSil
  5. Paylaşımlarınız için teşekkür ederiz. Herhangi bir sorunda dell laptop tamircisi olarak hizmet vermekten onur duyarız.

    YanıtlaSil

Yorum Gönder

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde (1, 2) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki:
“Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler, Sistem (Proje kapsamını belirtir), Use Caseler ve bunlar arasındaki ilişkiler. Şekil…

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Amaç, diyagramın sadece belirli k…

Cluster ve clustering nedir? Cluster oluşturmanın faydaları nelerdir? (Bölüm I)

Cluster, basit anlamda benzer bir amaç için belirli bir konfigürasyon yapılarak aynı görevi birlikte ya da yedekli çalışmasını sağlayan servistir. Cluster farklı amaçlarla oluşturulabilir fakat son kullanıcı tarafından her zaman tek bir bilgisayar gibi gözükecektir. Bir cluster oluşturmak için en azından iki adet sunucuya ihtiyaç vardır ve bir cluster içindeki her bir sunucu “node” olarak adlandırılır. İhtiyaç olan hizmete göre çeşitli sayıda nodelar bir araya gelerek clusterları oluşturmaktadır. Bir cluster oluşturmak için gerekli sebepler daha fazla performans ihtiyacı, yüksek erişilebilirlik (high availability) ya da her ikisi birlikte olabilir. Şimdi cluster çeşitlerini çok fazla ayrıntıya girmeden biraz daha yakından inceleyelim. Yüksek erişilebilirlik (High-availability) clusterlarıBu tip cluster yapısında öncelik erişilebilirliği arttırmadır. Bunu tek bir sunucunun görevini herhangi bir donanım yada yazılım problemi oluştuğunda diğer bir sunucunun otomatik olarak devralması olara…