16 Eylül 2016 Cuma

Active Directory Nedir - LDAP Nedir - Dizin (Directory) ve LDAP (Lightweight Directory Access Protocol) Kavramlar

Dizin ve LDAP kavramları ,özellikle kurumsal ortamlarda sıkça karşılaştığımız kavramlardandır. Peki nedir bunlar ve ne işe yararlar? 
Dizin(Directory): Belirli türden nesnelerden oluşan küme ve bu küme üzerinde sorgulama imkanı sağlayan yapı şeklinde özetlenebilir.Aslında dizin, bir veritabanıdır ve genellikle okuma ve arama gibi amaçlar için düzenlenmiş/optimize edilmiştir.İlk akla gelen örnekler telefon rehberi uygulamaları, bir ağ üzerinde bulunan bilgisayarlar hakkında tutulan kayıtlar vb. olabilir.
Hem veritabanında hem de dizin de bilgileri depolama vardır.Ama bu bilgilerin tutulma şeklileri farklıdır.
Normal bir veritabanı sisteminde verileri istenilen mantıkta ve yapıda tutmak mümkün iken, dizin mantığında bilgiler bir hiyerarşiye göre tutulur.Bu sebeble arama ve okuma işlemleri aynı işi yapan bir veritabanı uygulamasına gore daha performanslıdır denilebilir. Veritabanında rollback, transaction gibi kompleks işlemler desteklenirken dizin desteklemez. Yine veritabanı genelde dinamik iken dizin de statik bilgiler tutulur.Özetle veritabanı, veriler arasında bağlantıya ihtiyaç duyan uygulamalar için(ERP,Muhasebe gibi), dizin ise dağıtık çalışmaya ihtiyaç duyan uygulamalar için (kurumsal e-posta adres defteri, DNS sistemi gibi) tercih edilirler.
LDAP : 
Açılımı Lightweight Directory Access Protocol olan LDAP, X.500 standardı ile tanımlanan dizin erişim protokolünün hafifletilmiş sürümüdür.İletişim protokolü TCP/IP dir.(DAP(Directory Access Protocol), sunucu ve istemci arasındaki haberleşmeyi tanımlar.OSI modelinin uygulama katmanında çalışan bir protokoldür.Çalışabilmesi için tüm OSI katmanlarına ihtiyaç duyar.)

Ancak ihtiyaçlar geliştikçe X.500 (dolayısyla DAP protokolü) yetersiz kalmaya başladı.Bu aşamada LDAP geliştirildi.Önceleri X.500 dizin servislerine ulaşmak için düşünülmüş ise de sonradan kendisi bir dizin servisi haline geldi.
X.500 :
  • OSI protokol kümesini kullanırken LDAP TCP/IP protokolünü kullanır.
  • Daha karmaşıktır.
  • OSI kullanmasında dolayı özellikle masaüstü ve küçük sistemler için uygun değildir.
LDAP ise çok kaynak istemez ve TCP/IP ye ihtiyaç duyduğundan yaygın olarak kullanılabilmektedir.LDAP Client-Server mimarisi aşağıdaki gibi özetlemek mümkündür.



Domain Component (DC) - DNS İsmi

Firmanın DNS isminin noktalar hariç ayrılmış hali olara düşünülebilir. Örneğin DNS ismi firma.com ise dc aşağıdaki gibiolacaktır.
dc=firma,dc=com. 

Organizational Unit (OU) - Kullanıcının Ait Olduğu Grup

Kişinin ait olduğu gruplar olarak düşünülebilir. Örneğin ben personel ve muhasebe grubuna aitsem ou aşağıdaki gibi olacaktır.
ou=personel,ou=muhasebe
CN (Common Name) - Kullanıcı Ad Soyad

Bir nesneye verilen isim olarak düşünülebilir. Örneğin bir kullanıcı nesnesi için aşağıdaki gibi olacaktır.
cn = Cin Ali. cn genellikle ad ve soyad bilgisini içerir.

sAMAccountName
Kullanıcının login adı. Artık pek kullanılmıyor.

SN (Surname) - Kullanıcı Soyadı
Kullanıcının soyadı

Distinguished Name (DN)

DN bir nesneyi diğerlerinden ayırt edilebilir yapar. DN yukarıda belirtilen CN, OU ve DC'lerin bileşimidir. Yukarıdaki örneklere göre benim dn tanımım aşağıdaki gibi olacaktır.
cn=cin ali, ou=personel,ou=muhasebe,dn=firma,dn=com
Web adreslerinde önce DNS'ten başlanır sonra istenilen sayfa adresi gelir. Yani bir nevi büyükten küçüğe doğru gidilirken LDAP'te DN isminin oluşturulması için en küçükten en büyüğe doğru gidildiğine dikkat etmek lazım. Mastering LDAP Searchsayfasında şöyle bi cümle geçiyordu.
 objects “above” another object are notated as being to the right of the object in LDIF.

How do I build this LDAP connection string? sorusunda da cevaplandığı gibi aşağıdaki birimi sorgulamak için

"LDAP://ofmdcoly302.ofm.wa.lcl/ou=AR,ou=Citrix,ou=Users - OFMGOV,dc=ofm,dc=wa,dc=lcl" stringini kullanmak lazım.

LDIF
Herşeyi birleştiren bir LDIF dosyası şöyle



dn: dc=demo,dc=com
objectclass: top
objectclass: domain
dc: demo

dn: ou=Users,dc=demo,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Users
description: demo.Com Users


dn: uid=bob,ou=Users,dc=demo,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: User Test
sn: Test
displayName: User Test
givenName: User
mail: bob@demo.com
ou: Users
uid: bob
userPassword:: e1NTSEF9MGhuUjhnWkFNZFpKVUNwZXFwcFEzeUQ2YkJNOTVQUVo4WU9JSUE9P
 Q==
ldap sunucu urlsi
Sunuc url'si şuna benzer.

ldap://xxxx.com:389

objectClass Nedir

objectClass bir girdinin tipi hakkında bilgi verir. Örnek



LDAP ve Encoding

LDAP v3 UTF-8 encoding kullanır.

LDAP ve Büyük Küçük Harf
Microsoft LDAP schema case sensitive sorusunda da cevaplandığı gibi LDAP ile harf farklılığına bakmayı zorlamak için aşağıdaki gibi kullanmak lazım.

LDAP ve Hata Kodları
Buradaki soruda LDAP hata kodları ile ilgili verilmiş. Ancak AD hata kodları LDAP hata kodlarından biraz daha farklı olarak sub-code mantığı kullanıyor. Örneğin 49 authentication error. sub-code 773 ise şifre değiştirilmeli anlamına geliyor.

Java ve Ldap
Java ile Ldap'e bind edebilmek için kullanılan sınıfların hiyerarşisi kabaca aşağıdaki gibi.


DirContext sınıfı 
LDAP yazısına taşıdım.

Context sınıfı
Bu sınıf ile bir çok string hard-code tanımlı.
Context.SECURITY_AUTHENTICATION
Kullanılacak olan doğrulama mekanizması belirtiliyor. Mesela DIGEST-MD5 kullanılabilir. Örnek:
Hashtable env = new Hashtable();
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
DirContext ctx = new InitialDirContext(env);

Ldap ve timeout
Spring LDAP: Connection reset by peer sorusuna verilen cevap aşağıda.

Görüldüğü gibi tüm string sabitleri Context sınıfı tarafından tanımlanmıyor.

DirContext arayüzü
search metodu

DirContext.search metodu ile LDAP üzerinden arama yapmak mümkün. Aşağıda metodun aldığı parametreler var.


name olarak aşağıdaki gibi örnekler verilebilir.

final String name= "dc=ad,dc=my-domain,dc=com";

LDAP'ten bilgi çekerken arama filtresi olarak aşağıdaki örnekler gibi bir filtre verilir.


String filterExpr= "(&(objectClass=user)(userPrincipalName={0}))";
String filterExpr = "(&(objectClass=user)(sAMAccountName={0}))";

SearchControls sınıfı
Bu sınıf ile beraber iki tane scope seçeneği kullanılabilir. Bunlar Scope = ONELEVEL_SCOPE ve SUBTREE_SCOPE. İlki ağacın sadece verilen dalında arama yapar. İkincisi ise, verilen daldan aşağıdaki dalları da aramaya dahil eder.

NamingEnumeration sınıfı
Bu sınıf klasik bir enumeration. hasMoreElements() metodu ile dolaşılması mümkün.
Örnek:
NamingEnumeration<SearchResult> results = ctx.search(...);
SearchResult searchResult = null;
if(results.hasMoreElements()) {
    searchResult = (SearchResult) results.nextElement();
}
return searchResult;
SearchResult sınıfı

getAttributes
Örnek:
SearchResult srLdapUser = //...
String strPrimaryGroupID = (String)srLdapUser.getAttributes().get("primaryGroupID").get();

Spring ve Ldap
Sun tarafından sağlanan Java sınıflarını kullanmak zor olduğu için Spring ile gelen LdapTemplate sınıfı kullanılabilir. Aşağıdaki kodu LDAP Authentication sorusundan aldım.


C# ve LDAP
Bu sınıfları kullanmak için
using System.DirectoryServices;
yapmak gerekir.Ancak bu sınıfların sunduğu arayüzler biraz karışık.

DirectoryEntry sınıfı
ActiveDirectory'deki bir düğümü temsil eder.

DirectorySearcher sınıfı

PropertiesToLoad metodu
Aynı SQL'deki gibi aranan nesnenin hangi sütun/özelliklerinin sonuca dahil edilmesi gerektiği belirtilir.


DirectorySearcher dsLookFor = new DirectorySearcher(directoryEntry);
...
dsLookFor.PropertiesToLoad.Add("cn");
dsLookFor.PropertiesToLoad.Add("samAccountName");

FindOne metodu
SearchResult döner.

Örnekte kullanıcı doğrulaması gösterilmiş.

using System.DirectoryServices;
string domain, string username, string pwd;//Populate
string domainAndUsername = domain + @"\" + username;
 DirectoryEntry entry = new DirectoryEntry( _path,
                                             domainAndUsername,
                                               pwd);
// Bind to the native AdsObject to force authentication.
Object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");//cn common name, kullanıcı adı
SearchResult result = search.FindOne();
if(null == result)
{
  return false;
}
return true;
FindAll metodu
SearchResultCollection döner. SearchResultCollection for döngüsü ile yürünebililir. Her bir SearchResult nesnesinin Properties alanı ile sorgudaki bilgilere erişilebilir.


SearchResultCollection srcUsers = dsLookFor.FindAll();
foreach (SearchResult srcUser in srcUsers)
{
  Console.WriteLine("{0}", srcUser.Path);
  Console.WriteLine("{0}", srcUser.Properties["samAccountName"][0]);
}

System.DirectoryServices.AccountManagement altındaki sınıflar System.DirectoryServices'in altındaki sınıflara göre kullanması daha kolay arayüzler sunuyorlar.

UserPrincipal sınıfı
FindByIdentity
Örnek:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "server","CN=Users,DC=doom,DC=home","ldapuser","password");

 // get user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.Name, username);

 //is user locked
var locked = user.Enabled; 

Active Directory Notları

.net view /domain komutu ile domain'ler listelenebilir
.net view /domain:mydomain ile mydomain'e ait bilgisayarlar listelenebilir.

12 Mayıs 2016 Perşembe

Css Hover Kodu [Resmin Ustune Gelince Farklı Resim Gösterme]

Kod:
.konur{
width:372px;
position:absolute;
height:122px;
margin-top:26px;
margin-left:0px;
border:1px solid #efefef;
padding:5px;
}
.konur:hover{
background:url(ustune gelince cıkıcak resim url'si) no-repeat top center;
background-position: 5px 5px;
width:372px;
height:122px;
border:1px solid #cccccc;
-webkit-box-shadow: 0px 0px 5px 1px #cccccc;
-moz-box-shadow: 0px 0px 5px 1px #cccccc;
box-shadow: 0px 0px 5px 1px #cccccc;
}
.konu img{
width:3px;
border:1px solid #efefef;
padding:5px;
}
.konu img:hover{
border:1px solid #cccccc;
-webkit-box-shadow: 0px 0px 5px 1px #cccccc;
-moz-box-shadow: 0px 0px 5px 1px #cccccc;
box-shadow: 0px 0px 5px 1px #cccccc;
}

4 Mayıs 2016 Çarşamba

Controlller'ın İşlevi

Gelelim Mvc'nin yaşam döngüsüne...
Kullanıcıdan bir isek geldiğinde golabal.asax içerisindeki MapRoute yapısı ile yönlendirilecek controller ve ActionResult'a yönlenir. Action çalıştığında ilgili işlemler gerçekleştirilir.  Eğer gerçekleştirilecek işlemler arasında veritabanı işlemi varsa, Controller Model ile iletişime geçerek istediğini bildirir. Modelden dönen verileri controller işleyerek view üzerinde gösterime hazır hale getirir.
Kısaca belirtmek gerekirse Model ve View arasındaki verileri işleyerek iletişim görevi görür...

2 Mayıs 2016 Pazartesi

t-sql bütün field isimlerini almak


t-sql de INFORMATION_SCHEMA sistem view kullanılarak db deki bütün tablo ve field özellikleri okunabilir.
INFORMATION_SCHEMA view ile tablo ve field isimleri aşağıdaki şekilde alınabilir.

select COLUMN_NAME,* from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'YourTableName'
and COLUMN_NAME like 'FieldName'
order by ORDINAL_POSITION

26 Nisan 2016 Salı

scroll hesaplama

<script type="text/javascript">
    $(document).ready(function () {
        var scrollBottom = $(document).height() - $(window).height() - $(window).scrollTop();

        if ('@BasariMsg' != "") {
            setTimeout(function () {
                $('body').scrollTop(scrollBottom - 350);
            }, 2000);

        }
        else if ('@HataMsg' != "") {
            setTimeout(function () {
                $('body').scrollTop(scrollBottom - 350);
            }, 2000);
        }

    });
</script>

22 Nisan 2016 Cuma

MVC Output Cache Kullanımı

Öncelikle herkese merhabalar smiley Bu makalemde Asp.Net MVC uygulamalarında sıklıkla kullanılan bir önbellekleme yöntemi olan OutputCache filter’ının kullanımını inceliyor olacağız. Web projelerinin en büyük sıkıntıları hiç şüphesiz performans kayıplarıdır. Bunu büyük ölçüde absorbe  etmek içinde doğru yerlerde olma şartıyla caching işlemleri yapılır.
Örneğin günde yüzbinlerce kişinin girdiği, hepsiburada.com gibi bir siteyi ele alalım. Kategoriler arasında dolaşıyor, ürünleri inceliyor ve sipariş veriyorsunuz. Ancak hangi sayfada olursanız olun üst tarafta kategorileri hep görüyorsunuz. Yüzbinlerce kişinin bu sitede en az 3 sayfayı gezdiğini bile düşünürseniz kategoriler kısmının her seferinde veri tabanından çekiliyor olması büyük performans kayıpları yaşatacaktır.Sonuçta bu kısım an ve an değişiklik gösterebilen bir bölüm değil. Böyle bir siteye kategori eklenmesi belki birkaç ayda bir gerçekleşir.
Sonuç itibariyle böyle bir durumda yani kısa süreçler içerisinde değişime uğramayan veya anlık bilgi üretmeyen kısımların önbelleklenmesi (caching) büyük ölçüdeki performans kayıplarını bir hayli absorbe edecektir.
Bunun yanı sıra az önce “anlık bilgi üretmeyen…” kısmıyla da belirttiğim gibi durumlarda ise caching yapılması mümkün olup, istenilen sonuçların doğru üretilebilmesi çeşitli konfigürasyonlar ile sağlanabilmektedir.

Caching Çeşitleri

Caching işlemlerini Data Caching ve Output Caching olmak üzere ikiye ayırabiliriz.
Data Cache işlemleri .Net üzerinde, desteklediği tüm veri ve referans tiplerini ön bellekleyebileceğimiz ve her bir istekte ise önbellekten aynı veriyi alabileceğimiz bir model sunar. Böyle bir önbellekleme için yukarıda verdiğimiz örneği ele alırsak, veri tabanına bir kere bağlanılır ve çekilen kategori nesneleri data cache ile ön belleklenebilir.
Makalede inceleyeceğimiz Output Cache modeli ise çıktıların yani render edilmiş View bilgilerinin ön belleklenmesini ve timeout olana kadar gelen her bir istekte ise bir önceki ön belleklenmiş bilgilerin sunulmasını sağlar. Aynı örnek üzerinden ilerleyecek olursak output cache ile kategoriler kısmının ön belleklenmesi için kategoriler kısmını içeren bir PartialView’ın tamamının cache edilmesi gerekir.
Anlık değişim içerisinde olmayan bir çok verinin aynı sayfa üzerinde olacağı durumlarda, toplu bir cache mekanizmasına sahip olduğu için Output Cache kullanımı daha tutarlı bir çözüm olacaktır.
Cache yöntemlerinden ve istisna durumlarından da bahsettiğimize göre artık yapacağımız küçük uygulamalara geçebiliriz laugh
OutputCache kullanım kolaylığı sağlanması için Action Filter sınıfından kalıtılmıştır. Bu sayede Controller veya altında oluşturulabilecek Action’lar için Attribute olarak kullanılabilirler.

OutputCache Attribute'ün Kullanımı

Uygulamalarımızı yapabilmek için bir adet Asp.Net MVC 3 ya da 4 projesi açalım.
HomeController altında GetTime adında bir adet action yaratalım ve aşağıdaki gibi kodlayalım;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=10)]
        public ActionResult GetTime()
        {
            ViewBag.Date = DateTime.Now.ToString();
            return View();
        }
    }
}
Eklediğimiz Action için birde View ekleyelim ve onu da aşağıdaki gibi kodlayalım;
@{
    ViewBag.Title = "GetTime";
}

<h2>GetTime</h2>
@ViewBag.Date
Projeyi build edip, çalıştırırsanız karşınıza gelecek olan ilk ekranda o andaki saati görüyor olacaksınız. Siz sayfayı açtığınızda ise render edilen bu sayfa arka planda cache edildi ve bundan sonraki 10 saniyelik kısımda ise cache edilen sayfa ile karşılaşacağınız için aynı saat bilgisini görüyor olacaksınız.
Şimdi ise işin en güzel ve söylediğimiz şeylerin tutarlılığını kanıtlayacağımız kısma geldik laugh
Az önce dedik ki, bu sayfaya ilk girdiğimizde sayfa render edildi, bize gösterildi ve cache edildi. Timeout süresi dolana kadarda aynı sayfaya ulaşmaya çalıştığımızda cacheden gelen sayfa ile karşılaşacağız. Bunu bir de projeyi debug ederek irdeleyelim. Yukarıda kodlamış bulunduğumuz GetTime action kodlarındaki ilk satıra (ViewBag.Date...) bir adet breakpoint ekleyelim ve projeyi debug edelim.

Sayfaya ilk girişte akış breakpoint üzerine düşecektir. Fakat 10 saniyelik kısımda sayfaya tekrar ulaşmaya çalıştığınızda sayfa önünüze gelmesine rağmen, akış breakpoint üzerine düşmeyecektir. Bu da cache işlemi boyunca söz konusu action'ın hiç tetiklenmeyeceği anlamına gelmektedir. Teoride bahsettiğimiz şeylerin, gerçekte de örtüştüğünü gördüğümüze göre uygulamalarımıza devam edelim smiley

Client Bazlı Caching

OutputCache ile yapılabilecek cache işlemlerinin lokasyonunu diğer bir değişle baz alınacak referans yerini belirleyebilirsiniz. Bu konuyu derinlemesine incelerken referans edindiğimiz bir yabancı makale vardı (Linki aşağıda bulabilirsiniz) Aslında söz konusu istisna durum için en iyi örneği yaptığı için bende aynı örnek üzerinden devam ediyor olacağım.
Bu kısımda ise yine bir action yazalım. Adı GetUser olan bu action View kısmında membershipte login olmuş olan kullanıcının adını bize göstersin. Böyle bir action'ın yukarıdaki örnekte olduğu gibi cache edilmesi büyük bir istisna oluşturacaktır.
Örneğin kullanıcının adını görmemizi sağlayacak bu action 1 saatliğine cache edilmek üzere ayarlanmış olsun. Bu durumda A kullanıcısı sisteme login olduğu anda bu isim cache edilecektir. 1 saatlik süre içerisinde ise sisteme kim login olursa olsun yine A adını görüyor olacaktır.
Fakat burdaki cache işleminin Client Bazlı yapılması bu sorunu giderecektir. Bu sayede sayfa her bir client için ayrı ayrı cache edilecektir. Ancak burada ise bir performans kaybı yaşanacaktır. Sisteme 10 ayrı kişinin login olup bu sayfayı ziyaret ettiğini düşünürsek, bu sayfa 10 ayrı cache işlemine tabi tutulacaktır. Bu sorunu bir nebze giderebilmek için ise OutputCache işleminin NoStore özelliği kullanılabilir.
NoStore özelliği true olarak set edilen OutputCache işlemlerinde, render bilgileri kalıcı olarak saklanmazlar. Bu örnek için hazırladığım Action ve View kodları ise aşağıdaki gibidir;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=3600,Location=OutputCacheLocation.Client, NoStore=true)]
        public ActionResult GetUser()
        {
            ViewBag.Name = User.Identity.Name;
            return View();
        }
    }
}
View;
@{
    ViewBag.Title = "GetUser";
}

<h2>GetUser</h2>
@ViewBag.Name
Cache işleminin Client bazlı yapılması için yazılan attribute'e Location özelliğinin Client olarak  ve bilgilerin kalıcı olarak saklanmaması için de NoStore özelliğinin true olarak set edilmesi yeterli olacaktır.

Parametreleri Cache İşleminden Yalıtma

Makalenin girişinde anlık bilgi üreten sayfaların cache edilebilmesi için bazı işlemlerin uygulanacağından bahsetmiştik. Bir adet haber sitesi tasarladığımızı düşünelim. Proje de ise haberlerin detayını gösterecek bir sayfa tasarlıyor olalım. Bunun için yazılacak Detail adlı action ise gösterilecek haberin Id numarasını parametre olarak almaktadır.
Bu sayfanın cache edilmesi halinde, sayfada gösterilecek ilk haber hangisi ise cache timeout olana kadar hangi Id ile sayfa çağrılırsa çağrılsın aynı haber gösterilecektir. Bu durum da Id parametresinin cache işleminden yalıtılması gerekmektedir.
OutputCache mekanizması route value ve query string verilerinin yalıtılmasını VaryByParam özelliği ile sağlayabilmektedir. Yalıtılmak istenilen verilerin bu özelliğe aralarında virgül konularak set edilmesi yeterlidir.
Örnek olarak aşağıdaki kodu inceleyebilirsiniz;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        private readonly List<News> newsRepository;

        [OutputCache(Duration=3600, VaryByParam="id")]
        public ActionResult Detail(int id)
        {
            ViewBag.News = newsRepository.Where(q => q.Id == id).SingleOrDefault();
            return View();
        }
    }
}
Yukarıdaki action gelen Id bilgisine göre repoda bulunan haberi çekmekte ve View'e göndermektedir. OutputCache işleminin yukarıdaki gibi yapılması, Id değerinin cache işleminden yalıtılmasını sağlayacaktır.
Bunun yanısıra VaryByParam'ın "*" olarak set edilmesi ise söz konusu action'a gelecek tüm route value ve query stringlerin pragmatik bir şekilde yalıtılmasını sağlayacaktır. Çok fazla parametre alan action'lar için böyle bir yol izlenilmesi, tüm parametrelerin tek tek yazılmasındansa daha kolay bir çözüm sağlayacaktır.
Makaleyi yazarken referans aldığım yabancı kaynağı görmek için buraya tıklayabilirsiniz.
Bir sonraki makalemde görüşmek üzere, herkese esenlikler dilerim :)
H.Burak TUNGUT

Yazar Hakkında

11 Nisan 2016 Pazartesi

database yedekleme işlemleri

http://deryagunduz.com/?tag=sql-serverda-job-olusturma

https://www.mssqltips.com/sqlservertutorial/20/sql-server-backup-database-command/

10 Nisan 2016 Pazar

mvc web.config de dosya mb yükseltme

mvc web.config de dosya mb yükseltme 

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
    <validation validateIntegratedModeConfiguration="false" />

8 Nisan 2016 Cuma

bootstrap modal popup scroll


css  dosyası
.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}


html  dosyası

<!-- Button trigger modal -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch demo modal
</button>

<div id="myModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">Modal title</h4>
            </div>
            <div class="modal-body">
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel vehicula erat. Phasellus vestibulum leo eu mi tempor blandit. Suspendisse eget iaculis lectus. Donec vitae tempus enim, quis tristique magna. Donec lobortis, sem ac pretium viverra, leo nisl consequat arcu, sit amet ullamcorper nunc turpis ac erat. In rutrum auctor ligula, quis mattis enim lacinia eu. Aliquam at magna a erat laoreet iaculis quis a justo. Donec porttitor vulputate massa, nec suscipit nisi mollis sed.</p>
                <p>Praesent sit amet porttitor magna, auctor feugiat tellus. Sed venenatis tortor turpis, vel vestibulum eros pulvinar et. Pellentesque hendrerit diam quis dui euismod tincidunt. Sed sit amet mauris ipsum. Integer in magna tellus. In tincidunt mi quis nunc gravida sollicitudin. Aliquam ac dui eget erat consequat volutpat in eu magna.</p>
                <p>Sed feugiat bibendum leo consequat convallis. Donec facilisis, turpis a scelerisque venenatis, felis diam dictum tortor, vitae imperdiet tortor ligula eu lectus. Donec iaculis semper elementum. Nullam dapibus porttitor magna quis convallis. Morbi porttitor quam non magna ullamcorper rhoncus. Phasellus sit amet nunc at turpis pharetra luctus a a massa. Praesent luctus massa in odio faucibus eleifend.</p>
                <p>In eget lobortis leo, ut luctus odio. Mauris pharetra erat ac tellus hendrerit semper. Cras faucibus ipsum id ante hendrerit rutrum. Donec vitae ullamcorper arcu. Aliquam pellentesque faucibus placerat. Aliquam erat volutpat. In tincidunt metus sit amet ligula sagittis vehicula. Pellentesque velit quam, hendrerit a erat ac, fermentum tincidunt enim. Cras suscipit justo nec consectetur lacinia.</p>
                <p>Cras pellentesque urna a leo egestas, at ullamcorper augue suscipit. Nulla id lacinia magna, non iaculis est. Praesent a placerat augue, eget eleifend purus. Aenean dignissim, orci et rutrum facilisis, tellus massa porta nulla, quis hendrerit dui ipsum vitae urna. In mattis lectus dolor, id venenatis lectus pellentesque at. Suspendisse posuere metus vel bibendum dignissim. Fusce interdum magna id libero scelerisque suscipit. Duis orci augue, rhoncus eget pharetra ac, viverra nec magna. In accumsan nulla ac suscipit pellentesque. Nulla iaculis luctus tellus, at ultricies urna hendrerit a. Aenean vehicula sodales varius. Duis sodales hendrerit odio non sagittis.</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary">Save changes</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>
<!-- /.modal -->
kaynak : http://jsfiddle.net/jasny/zclse/

6 Nisan 2016 Çarşamba

Mvc İletişim Formundan Mail Gönderme


İletişim Formuna post edildiğinde Mail gönderme işlemi  

[HttpPost]
        public ActionResult iletisimformu(iletisimForm Model)
        {

            string hataMsg = string.Empty;
            string basariMsg = string.Empty;
         try
            {     if (ModelState.IsValid)
                    {
                        var islem = Gonder(Model);
                        if (islem)
                        {
                            ModelState.Clear();
                            basariMsg = "İşlem başarılı";
                        }
                        else
                        {
                            hataMsg = "İşlem sırasında bir hata oluştu...";
                        }
                    }
                    else
                    {
                        hataMsg = "'*' alanları doldurunuz";
                    }
               
            }
            catch (Exception ex)
            {
                hataMsg = ex.Message;
            }

            ViewData["Hata"] = hataMsg;
            ViewData["Basari"] = basariMsg;

            return View();
        }

 public bool Gonder(iletisimFormModel)
        {
   StringBuilder sb = new StringBuilder();

                           sb.Append(string.Format("<strong>Adı Soyadı : </strong> {0}<br/>", Model.AdSoyad));
                            sb.Append(string.Format("<strong>Telefon : </strong> {0}<br/>", Model.Telefon));
                            sb.Append(string.Format("<strong>Eposta : </strong> {0}<br/>", Model.Eposta));
                            sb.Append(string.Format("<strong>Ev Adresi : </strong> {0}<br/>", Model.EvAdresi));
                     
                            sb.Append(string.Format("<strong>Doğum Tarihi : </strong> {0}<br/>", Model.DogumTarih));
                            sb.Append(string.Format("<strong>Cep Telefonu : </strong> {0}<br/>", Model.CepTelefon));
               
                            return Helper.MailGonder(ayar.EvdeBakimHizmetleriEpostaAdresi, sb.ToString(), "Evde Bakım Formu");

}
   public static class Helper
    {
   public static bool MailGonder(string AlanMail, string Yanit, string Konu)
        {
            try
            {

                MailMessage Mesaj = new MailMessage();
                Mesaj.From = new MailAddress("info@durmusyilmaz.com.tr");
                Mesaj.To.Add(AlanMail);
                Mesaj.Subject = Konu;
                Mesaj.Body = Yanit;
                Mesaj.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient("mail.durmusyilmaz.com.tr", 587);
                System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("info@durmusyilmaz.com.tr", "*******");
                smtp.UseDefaultCredentials = true;
                smtp.EnableSsl = true;
                smtp.Credentials = SMTPUserInfo;
                smtp.Send(Mesaj);
                return true;
            }
            catch { return false; }
        }
}

4 Nisan 2016 Pazartesi

add this aynı sayfada farklı paylasım oluşturma

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - My ASP.NET MVC Application</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />

</head>
<body>

  <div class="share-btn addthis_toolbox">
                                    <a class="addthis_button_facebook">addthis_button_facebook
                                    </a>
                                    <a class="addthis_button_twitter">
                                        <span class="hiper-twitter"></span>addthis_button_twitter
                                    </a>
                                    <a href="#" class="addthis_button_more" target="_blank" title="View more services">
                                    +
                                    </a>
                                    <div class="atclear"></div>
 </div>


 <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js" async="async"></script>
    <script type="text/javascript">
        $('.addthis_button_more,.addthis_button_facebook,.addthis_button_twitter').click(function () {
            addthis.init();
            var pUrl;
            pUrl = "@Request.Url" + "/sharer/" + window.location.href.split('#')[1].split('/')[0].replace('item', '');
            console.log(pUrl);
            addthis.update('share', 'url', pUrl);
            addthis.toolbox('.addthis_sharing_toolbox-CUSTOM');
        });
    </script>
</body>

</html>

26 Mart 2016 Cumartesi

E bülten kayıt Form Json

    public class HomeController : Controller
    {
    public JsonResult EbultenKayit(string Eposta, string dil)
        {
            using (var db = new Models.DataBaseDB())
            {
                var sonuc = new EbultenSonucModel();
                if (!string.IsNullOrEmpty(Eposta))
                {

                    var epostaVarmi = db.EBultenler.Count(x => x.Eposta == Eposta) > 0;

                    if (epostaVarmi)
                    {
                        sonuc.Durum = false;

                        if (dil.ToLower() == "en")
                            sonuc.Mesaj = "E-mail address is already available.";
                        else
                            sonuc.Mesaj = "Bu eposta zaten mevcut";

                    }
                    else
                    {

                        if (IsValid(Eposta))
                        {
                            var M = new Models.EBulten();
                            M.Eposta = Eposta;
                            M.GelisTarih = DateTime.Now;
                            M.IpAdres = Request.UserHostAddress;

                            db.EBultenler.Add(M);
                            db.SaveChanges();
                            sonuc.Durum = true;
                            if (dil.ToLower() == "en")
                                sonuc.Mesaj = "Your operation has been successfully completed.";
                            else
                                sonuc.Mesaj = "İşlem başarılı";
                        }
                        else
                        {
                            sonuc.Durum = false;
                            if (dil.ToLower() == "en")
                                sonuc.Mesaj = "Invalid e-mail.";
                            else
                                sonuc.Mesaj = "Geçersiz Eposta." + dil;
                        }
                    }
                }
                else
                {
                    sonuc.Durum = false;
                    if (dil.ToLower() == "en")
                        sonuc.Mesaj = "It is required to fill in e-mail section";
                    else
                        sonuc.Mesaj = "Eposta boş geçilemez";
                }
                return Json(sonuc, JsonRequestBehavior.AllowGet);
            }
        }

        public class EbultenSonucModel
        {
            public string Mesaj { get; set; }
            public bool Durum { get; set; }
        }
        public bool IsValid(string emailaddress)
        {
            try
            {
                MailAddress m = new MailAddress(emailaddress);
                return true;
            }
            catch
            {
                return false;
            }
        }}

namespace ProjeAdi.Models
{

    [Table("EBultenler")]
    public class EBulten
    {
        [Key]
        public int EBultenId { get; set; }

        [Required(ErrorMessage = "Boş Geçilemez")]
        [EmailAddress(ErrorMessage = "Geçerli Bir Eposta Giriniz")]
        public string Eposta { get; set; }

        public DateTime GelisTarih { get; set; }
        public string IpAdres { get; set; }
    }
}

html -------------------------------------
        <form class="form-inline form-newsletter">
                    <div class="form-group">
                        <label for="signUp">E-bülten</label>
                        <input type="text" id="Eposta" class="input-email form-control" placeholder="E-posta adresinizi giriniz">
                        <button type="button" onclick="EbultenSave()" class="btn btn-submit btn-primary"><i class="fa fa-angle-right icon-submit"></i></button>
                        <div class="ebultenmesaj">
                            <div class="alert alert-danger alert-dismissible fade in" role="alert">
                                <button type="button" onclick="EbultenSave()" class="close" data-dismiss="alert" aria-label="Close">
                               
                                </button>
                                <p> </p>
                            </div>
                            <div class="alert alert-success alert-dismissible fade in" role="alert">
                                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                               
                                </button>
                                <p></p>
                            </div>
                        </div>
                    </div><!-- /.form-group -->
                </form><!-- /.form-newsletter -->
html -------------------------------------!
script --------------------------
   <script type="text/javascript">
        $('.ebultenmesaj .alert-success').hide();
        $('.ebultenmesaj .alert-danger').hide();
        function EbultenSave() {
            var url = "/@dil/EbultenKayit";
            var eposta = $('#Eposta').val();
            $.getJSON(url, { Eposta: eposta }, function (data) {
                console.log(data)
                if (data.Durum) {
                    $('.ebultenmesaj .alert-danger').hide();
                    $('.ebultenmesaj .alert-success').show().find('p').html(data.Mesaj);
                    $('#Eposta').val('');
                }
                else {
                    $('.ebultenmesaj .alert-success').hide();
                    $('.ebultenmesaj .alert-danger').show().find('p').html(data.Mesaj);
                }

            });
        }
    </script>






23 Mart 2016 Çarşamba

Mvc Controller tarafında mobile yönlendirmek için kullanılır

     
Mvc Controller tarafında mobile yönlendirmek için kullanılır
if (Request.Browser.IsMobileDevice && !Request.UserAgent.ToLower().Contains("ipad"))
            {
                Response.Redirect("/Mobile");
            }

18 Mart 2016 Cuma

Responsive Recaptcha

iletisimformu.cshtml 
var recaptchaUrl=string.Format("https://www.gstatic.com/recaptcha/api2/r20150714174420/recaptcha__{0}.js", lng);
    <div class="form-group ">
          <div class="captcha">
                   @using Recaptcha;
                   @Html.Raw(Html.GenerateCaptcha(string.Empty, "clean", "tr", null))
                             
        </div>
</div>

recaptcha.css 
@media(max-width:991px) {
    #recaptcha_challenge_image {
        margin: 0 !important;
        width: 285px !important;
    }

    #recaptcha_response_field {
        height: 40px;
        padding: 10px;
        width: 285px !important;
    }

    .recaptchatable #recaptcha_image {
        width: 100px !important;
    }

    .recaptchatable .recaptcha_r1_c1,
    .recaptchatable .recaptcha_r3_c1,
    .recaptchatable .recaptcha_r3_c2,
    .recaptchatable .recaptcha_r7_c1,
    .recaptchatable .recaptcha_r8_c1,
    .recaptchatable .recaptcha_r3_c3,
    .recaptchatable .recaptcha_r2_c1,
    .recaptchatable .recaptcha_r4_c1,
    .recaptchatable .recaptcha_r4_c2,
    .recaptchatable .recaptcha_r4_c4,
    .recaptchatable .recaptcha_image_cell {
        background: none !important;
        width: 150px !important;
    }
}

@media(max-width:767px) {
    #recaptcha_challenge_image {
        margin: 0 !important;
        width: 125px !important;
    }

    #recaptcha_response_field {
        height: 40px;
        padding: 10px;
        width: 125px !important;
    }

    .recaptchatable #recaptcha_image {
        width: 100px !important;
    }

    .recaptchatable .recaptcha_r1_c1,
    .recaptchatable .recaptcha_r3_c1,
    .recaptchatable .recaptcha_r3_c2,
    .recaptchatable .recaptcha_r7_c1,
    .recaptchatable .recaptcha_r8_c1,
    .recaptchatable .recaptcha_r3_c3,
    .recaptchatable .recaptcha_r2_c1,
    .recaptchatable .recaptcha_r4_c1,
    .recaptchatable .recaptcha_r4_c2,
    .recaptchatable .recaptcha_r4_c4,
    .recaptchatable .recaptcha_image_cell {
        background: none !important;
        width: 150px !important;
    }
}


#recaptcha_challenge_image {
    margin: 0 !important;
    width: auto;
}

#recaptcha_response_field {
    height: 40px;
    padding: 10px;
}

.recaptchatable #recaptcha_image {
    width: auto !important;
}

.recaptchatable .recaptcha_r1_c1,
.recaptchatable .recaptcha_r3_c1,
.recaptchatable .recaptcha_r3_c2,
.recaptchatable .recaptcha_r7_c1,
.recaptchatable .recaptcha_r8_c1,
.recaptchatable .recaptcha_r3_c3,
.recaptchatable .recaptcha_r2_c1,
.recaptchatable .recaptcha_r4_c1,
.recaptchatable .recaptcha_r4_c2,
.recaptchatable .recaptcha_r4_c4,
.recaptchatable .recaptcha_image_cell {
    background: none !important;
    width: 50px !important;
}