Alper Konuralp

Kartınızı Oluşturun
Google+
Follow @alperkonuralp

Posts Tagged ‘Asp.Net’

ASP.Net uygulamalarında ConnectionString’i şifrelemek

ASP.Net uygulamalarımızda en çok kullandığımız yöntemlerden biri, connectionString’i web.config dosyası içerisinde tanımlamak. Bu sayede tekrardan derlemeye gerek kalmadan uygulamamızın veri tabanı sunucusunu değiştirme şansına sahip olmaktayız. Aynı zamanda tek yerden yapılan güncelleme kod içerisinde connectionstring arama derdinden bizi kurtarmakta. Bu özellik gerçekten güzel gibi ama bazen bu bağlantının meraklı gözlerden saklanması gerekebilir. Bunun için web.config içerisindeki bazı alanların şifrelenebilmesi mümkündür. Önce şifreleyebileceğimiz alanlara bakalım :

  • <connectionStrings>
  • <processModel>
  • <runtime>
  • <mscorlib>
  • <startup>
  • <system.runtime.remoting>
  • <configProtectedData>
  • <satelliteassemblies>
  • <cryptographySettings>
  • <cryptoNameMapping>
  • <cryptoClasses>

Şifreleme 2 ayrı yöntem ile yapılabilir.
1. Yöntem
İlk yöntemimiz aspnet_regiis.exe programını kullanmak. Bu yöntemde web.config dosyasını şifreleyeceğiniz sunucuya bağlı olmanız veya kendi test makinanızda çalışıyor olmanız lazım. Çünkü bu uygulamayı çalıştırabilmek için web sitesinin bulunduğu makinada Dos Komut İstemi açmanız gerekecek. Gelelim işlemin nasıl yapılacağına :

1. Önce web sitesinin bulunduğu makinada bir Dos Komut İstemi (Command Prompt) açalım. İşi sağlama almak için Yönetici olarak açmayı(Run as administrator) seçebiliriz. ( Start -> All Programs -> Accessories -> Command Prompt -> Sağ tık -> Run as Administrator )

2. Açılan pencerede

cd %WINDOWSDIR%\Microsoft.Net\Framework\v2.0.50727

veya

cd %WINDOWSDIR%\Microsoft.Net\Framework\v4.0.30319

yazıp enter’e basarız. böylece programın yer aldığı dizine varırız.

3. Artık şifreleme veya açma işine başlayabiliriz.
a) Şifreleme : aspnet_regiis.exe’nin -pe parametresini kullanarak yapılır. pe parametresinden sonra şifrelemek istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
-prov parametresi : şifreleme için kullanılacak provider’ı belirtir. bu parametre için DataProtectionConfigurationProvider değeri kullanılır.
Tam olarak yazımına bakarsak :

aspnet_regiis.exe -pe connectionStrings -prov DataProtectionConfigurationProvider -site "http://deneme.konuralp.gen.tr" -app /

Böylece web.config dosyasının içindeki connectionStrings alanının şifrelendiğini görürüz.

b) Şifreyi Açma : aspnet_regiis.exe’nin -pd parametresini kullanarak yapılır. pd parametresinden sonra şifresini açmak istediğiniz xml elemanını belirtirsiniz. Mesela connectionStrings gibi. Kullanılabilecek değerleri yukarıdaki listede vermiştim. Ayrıca buna ek olarak kullanmamız gereken bazı alt parametreler daha var :
-site parametresi : hangi sitenin web.config dosyasını şifreleyeceğimizi belirtir.
-app parametresi : site içindeki hangi uygulamanın şifreleneceğini belirtir.
Tam olarak yazımına bakarsak :

aspnet_regiis.exe -pd connectionStrings -site "http://deneme.konuralp.gen.tr" -app /

Böylece web.config dosyasının içindeki connectionStrings alanının şifresinin çözüldüğünü görürüz.

2. Yöntem
Kod ile aynı işlemi yapabilmekte mümkündür. Özellikle hosting gibi yerlerde bize makinada uzak bağlantı açma hakkı verilmez. Bu yüzden istediğimiz işlemleri dos komut istemi ile yapmamız mümkün olmaz. Böyle durumlarda kod ile de istediğimiz sonuca ulaşabiliriz. Öncelikle web.config dosyamızı açmamız gerekiyor. bunun için :

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

kodunu kullanırız. Sonrada üzerinde şifreleme veya açma yapacağımız xml bölgesine ulaşmamız lazım.

ConfigurationSection section = config.GetSection("connectionStrings");

connectionStrings yerine yukarıdaki listede yer alan herhangi bir elemanı da kullanabilirsiniz. Bu noktada ilerlemeden önce section içinde veri olup olmadığını kontrol etmek gerekir. Eğer null değer içerir ise bir sonraki işlemimizde hata oluşur.
section nesnemizin özellikleri arasında yer alan section.SectionInformation.IsProtected özelliği bu noktada bizim için önemli. bu özellik bu alanın şifreli olup olmadığı bilgisini bize veriyor. Bunu şifreleme yaparken alanı tekrardan şifrelemeye çalışmamak için, veya açma yaparkende şifresiz bir alanı açmaya çalışmamak için kullanabiliriz.
Gerekli kontrolleri yaptıktan sonra artık alanı şifreleme veya açma işlemini yapabiliriz :
Şifrelemek için :

section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");

Açmak için :

section.SectionInformation.UnprotectSection();

Son olarak değişikliğin dosyaya yansıtılması için :

config.Save();

Böylece işlem tamamlanır. Bu işleri daha kolay yapabilmek için 2 ayrı metod haline getirirsek :

public static class CommonOperations
{
    public static void ProtectSection(string sectionName, string provider)
    {
        Configuration config = WebConfigurationManager. OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);

        ConfigurationSection section = config.GetSection(sectionName);

        if (section != null && !section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection(provider);
            config.Save();
        }
    }

    public static void UnProtectSection(string sectionName)
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);

        ConfigurationSection section = config.GetSection(sectionName);

        if (section != null && section.SectionInformation.IsProtected)
        {
            section.SectionInformation.UnprotectSection();
            config.Save();
        }
    }
}

Kullanırken ise :
Şifrelemek için :

CommonOperations.ProtectSection("connectionStrings", "DataProtectionConfigurationProvider");

Açmak için :

CommonOperations.UnProtectSection("connectionStrings");

şeklinde olabilir.

ASP.NET AJAX 4.0 Preview 5

ASP.NET AJAX kütüphanesinin son versiyonu olan 4.0′ın 5 numaralı ön sürümü görücüye çıktı.

ASP.NET AJAX kütüphanesinin özellikleri şöyle:

  • istemci şablonları ile veri tabanı verilerini tarayıcıda formatlamak
  • DataView kontrolü gibi istemci kontrolleri
  • İstemci DataContext bileşeni, Değişimin izlemesini ve kimlik yönetimini destekler
  • ADO.NET Veri Servisleri desteği
  • WCF ve ASMX Web servis desteği
  • JSONP desteği
  • Düz JavaScript nesneleri için Gözlemlenebilir desen
  • Live Bindings
  • Command Bubbling
  • Karmaşık bağlantılar ve varlıklar arasındaki ilişkiyi birden fazla varlık setleri veya tablolardan yönetmek için destek

Şu adresten indirebilirsiniz.

ASP.Net Çıktı Ön Belleği (Output Cache)

ASP.Net’in Gizli Gücü

Web sitelerimizin herkese açık ara yüzleri genellikle belli aralıklarda güncellenir. Ancak ASP.Net bu sayfaları her istek olduğunda tekrardan oluşturur ve istemciye gönderir. Çok fazla kullanıcının izlediği sayfalarda bu bizim sayfalarımızın ve web sitelerimizin yavaş çalışmasına yol açacak şekilde yavaşlamaya başlar. Esasında bu problemin kolay bir çözüm yolu vardır. Oda Çıktı ön bellek’idir.

ASP.Net çıktı ön belleği şu şekilde çalışır. Sayfa ilk istendiğinde sayfa ASP.Net tarafında çalıştırılır. Ve sonuç html çıktısı özel bir alanda saklanır. Aynı sayfa tekrar istenecek olursa, hiç sayfa tekrardan çalıştırılmadan, özel alandaki bilgi istemciye gönderilerek çok daha hızlı bir şekilde işlem biter. Sistemin yorulması engellenerek, daha performanslı bir şekilde çalışma sağlanmış olur.

Şimdi bir sayfada nasıl çıktı ön belleği kullanılabileceğini görelim.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head id="Head1" runat="server">
		<title>Caching</title>
	</head>
	<body>
		<form id="form1" runat="server">
			<%= DateTime.Now.ToString() %>
		</html>
	</title>
</html>

Şeklinde hazırladığımız basit sayfamızı Çıktı ön belleği özelliğini aktif edecek şekilde şöyle ayarlayabiliriz.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ OutputCache Duration="600" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head id="Head1" runat="server">
		<title>Caching</title>
	</head>
	<body>
		<form id="form1" runat="server">
			<%= DateTime.Now.ToString() %>
		</html>
	</title>
</html>

Burada duration ön bellek süresini ifade eder. Saniye cinsinden girilir.

VaryByParam =none ise ön bellek için herhangi bir parametrenin kullanılmayacağını ve sayfanın herkese aynı şekilde gösterileceğini ifade etmektedir.

Böylece tek satırlık bir işlem sonucunda sayfamız 10 dakika süreliğine ön belleğe alınmış olacaktır. Bu tek başına yeterli gelmeyebilir. Mesela her bir tarayıcı için ayrı ayrı ön bellekleme yapılabilir. Şimdi ön bellek ayarlarını nasıl yapabileceğimize bakalım.

VaryByParam kullanımı :

Bu ayara yazılacak olan parametreler QueryString, Form, Cookie’ler veya ServerVariables içerisinde aranarak bulunmaya çalışılır. Eğer none yazacak olursak, herhangi bir şey seçmemiş oluruz.

Örneğin:

VaryByParam="txtName;lstSelection"

txtName ve lstSection’ın her bir farklı değerleri için bir ön bellek oluşturulacaktır.

Bu İçerik Yönetim Sistemleri için uygun bir yöntem olabilir. Mesela adreste sayfayı gösteren bir parametre kullanılıyor ise:

http://www.deneme.com/page.aspx?id=5

bu sayfalar için VaryByParam=”id” tanımlamasını yapmak her bir id için ayrı bir ön bellek yapılması sağlanabilir.

VaryByControl kullanımı:

Sayfamızın içinde yer alan kontrollere göre bir ön bellek yapılsın istiyorsak bu özelliği kullanabiliriz.

Controls.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls.aspx.cs" Inherits="OutputCacheDemo.Controls" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head runat="server">
		<title></title>
	</head>
	<body>
		<form id="form1" runat="server">
			<div>
				<asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true"
					onselectedindexchanged="ddl1_SelectedIndexChanged">
					<asp:ListItem>1. Seçenek</asp:ListItem>
					<asp:ListItem>2. Seçenek</asp:ListItem>
					<asp:ListItem>3. Seçenek</asp:ListItem>
					<asp:ListItem>4. Seçenek</asp:ListItem>
					<asp:ListItem>5. Seçenek</asp:ListItem>
				</asp:DropDownList>
				<asp:DropDownList ID="ddl2" runat="server">
				</asp:DropDownList>
			</div>
		</html>
	</title>
</html>

Controls.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace OutputCacheDemo
{
    public partial class Controls : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
		{
			if (!IsPostBack)
			{
				ddl2DataBind();
			}
		}

		protected void ddl1_SelectedIndexChanged(object sender, EventArgs e)
		{
			ddl2DataBind();
		}

		private void ddl2DataBind()
		{
			ddl2.Items.Clear();
			for (int i = 1; i <= 5; i++)
			{
				ddl2.Items.Add(string.Format("{0}. seçeneğin {1}. alt seçeneği", ddl1.SelectedIndex + 1, i));
			}
		}
	}
}

Bu sayfada çıktı ön belleğini şu şekilde yazacak olursak, sayfa ddl1 kontrolünün her farklı değeri için ön belleklenecektir.

<%@ OutputCache Duration="600" VaryByParam="none" VaryByControl="ddl1" %>

VaryByHeader Kullanımı:

Http isteğinde gelen bilgilere göre sayfanızın ön belleklenmesini istiyorsanız bu özelliği kullanabilirsiniz. Mesela tarayıcıya göre ön bellek oluşturmak için:

<%@ OutputCache Duration="600" VaryByParam="none" VaryByHeader="User-Agent" %>

veya tarayıcıda tanımlı dillere göre ön bellek oluşturmak için

<%@ OutputCache Duration="600" VaryByParam="none" VaryByHeader="Accept-Language" %>

yazmak gerekir.

VaryByCustom Kullanımı:

Ön bellekleme için kendimize göre değerler belirleyebilmemiz mümkün. Bunu diğer yöntemlerden sonuç alamadığımızda kullanabiliriz. Bu değerlere göre ASP.Net ön bellek oluşturabilir. Bu değeri oluşturabilmek için global.asax içerisine aşağıdaki gibi bir kod yazmamız yeterli olacaktır.

public override string GetVaryByCustomString(HttpContext context, string custom)
{
	if (string.Compare(custom, "browser", true) == 0)
	{
		return string.Format("{0} {1}", context.Request.Browser.Browser, context.Request.Browser.Version);
	}
	return base.GetVaryByCustomString(context, custom);
}

Kullanımı ise

<%@ OutputCache Duration="600" VaryByParam="none" VaryByCustom="Browser" %>

Şeklinde olacaktır.

Şimdiye kadar hep sayfalar üzerinde anlattığımız bu detaylar, Kullanıcı tanımlı kontrollerde de(User Controls) kullanılabilmektedir. Hatta bu yöntem sayfanın parçalı olarak ön belleklenmesinide sağlayabilir.

Örnek olarak aşağıdaki kontrolleri ve sayfaları inceleyelim:

UC1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UC1.ascx.cs" Inherits="OutputCacheDemo.UC1" %>
<%@ OutputCache Duration="600" VaryByParam="none" %>
<%= DateTime.Now.ToString() %>

UC2.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UC2.ascx.cs" Inherits="OutputCacheDemo.UC2" %>
<%@ OutputCache Duration="300" VaryByParam="none" %>
<%= DateTime.Now.ToString() %>

Bu 2 kontrolü sayfa içerisinde şöyle kullanabiliriz:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Controls2.aspx.cs" Inherits="OutputCacheDemo.Controls2" %>
<%@ Register Src="UC1.ascx" TagName="UC1" TagPrefix="uc1" %>
<%@ Register Src="UC2.ascx" TagName="UC2" TagPrefix="uc2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head runat="server">
		<title></title>
	</head>
	<body>
		<form id="form1" runat="server">
			<uc1:UC1 ID="UC11" runat="server" />
			<br />
			<uc2:UC2 ID="UC21" runat="server" />
		</html>
	</title>
</html>

Bu sayfanın ekran görüntüsü:

5 dakika sonra alınan ekran görüntüsü:

Şeklinde olacaktır.  Böylelikle sayfanın farklı bölgeleri farklı ön bellek sürelerine sahip olabilecektir.

Bazı Kaynak Adresleri

http://www.csharpnedir.com

http://www.msakademik.net

Referans Sitesi:

http://www.devguru.com

Code Project:

http://www.codeproject.com

MSDN:

http://www.msdn.com

Asp.net Official Site:

http://www.asp.net

Silverlight Official Site:

http://silverlight.net/

Codeplex: (Open Source Proje Birliği)

http://www.codeplex.com/

Sourceforge : (Open Source Proje Birliği)

http://www.sf.net

Notepad++ : (Çok iyi bir notepad uygulaması)

http://notepad-plus.sourceforge.net/uk/site.htm

Urlrewriting.Net ‘i ayarlamak

Urlrewriting.Net, web sayfalarımızda url adreslerimizi değiştirmemizi, daha kullanıcı dostu yapmamızı sağlayan bir komponenttir. Bu komponent’i http://www.urlrewriting.net adresinden indirebiliyoruz.

Bende size komponent’in nasıl projemize dahil edebileceğimizi anlatmak istiyorum.

Öncelikle indirdiğimiz dosyanın içindeki ddl dosyasını projemizin referanslarına ekliyoruz. Sonra web.config içerisinde aşağıdaki değişiklikleri yapmamız gerekiyor.

1. configSections altına aşağıdaki satırı ekleyelim:

<section 	name="urlrewritingnet" restartOnExternalChanges="true" requirePermission ="false"
	type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"  />

2. system.web altındaki httpModules altına aşağıdaki satırı ekleyelim:

<add name="UrlRewriteModule"
    type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />

3. </configuration> satırından önce aşağıdaki satırları ekleyelim.

<urlrewritingnet
    rewriteOnlyVirtualUrls="true"
    contextItemsPrefix="QueryString"
    defaultPage = "default.aspx"
    defaultProvider="RegEx"
    xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
    <rewrites>
        <!—kuralları buraya yazacağız. -->
    </rewrites>
  </urlrewritingnet>


4. yönlendirmek istediğimiz her bir sayfa için bir kural oluşturmamız gerekiyor. Veya regex kullanarak birden fazla sayfa içinde kurallar oluşturabiliriz. Bu kurallar 3. adımda eklediğimiz urlrewritingnet başlığı altındaki rewrites başlığı altına eklememiz gerekmekte. Örnek olarak oluşturduğum bir kural aşağıda gösterilmiştir.

<add name="Rewrite01"  virtualUrl="^~/([a-z]{2}-[a-z]{2})/(.*)_([0-9]+).aspx"
           rewriteUrlParameter="ExcludeFromClientQueryString"
           destinationUrl="~/PageSystem.aspx?lang=$1&pid=$3"
           ignoreCase="true" />

 

bu kural ile http://alper.konuralp.gen.tr/tr-TR/GirisSayfasi_12.aspx sayfasını açmaya çalıştığınızda arkada http://alper.konuralp.gen.tr/PageSystem.aspx?lang=tr-TR&pid=12 sayfasını çağırmış olmakta.

İyi Çalışmalar

İzmir Yazılım Grubu
Google Groups
Subscribe to İzmir Yazılım Grubu
Email:
Visit this group
Mayıs 2012
Pts Sal Çar Per Cum Cts Paz
« Şub    
 123456
78910111213
14151617181920
21222324252627
28293031  
Yeni Downloadlar
StatPress
Visits today: 98
Sahip oldugum diger adresler :
3dmaxtraining.info
3dmaxtrainings.com
3dmaxtrainings.info
adobelearning.info
adobelearnings.info
adobetrainings.com
adobetrainings.info
autocadbootcamp.info
autocadexams.info
autodesklearning.info
autodesklearnings.com
autodesklearnings.info
ciscotrainings.info
egepro.com
elonunbahcesi.com
elonunbahcesi.info
flashbootcamp.info
flashexams.com
flashexams.info
konuralp.biz
konuralp.org
mayatutorial.info
mayatutorials.info
microsoftexams.info
microsofttrainings.info
proege.com
sharepointlearning.info
sharepointlearnings.com
sharepointlearnings.info
sharepointtutorial.info
silverlightbootcamp.info
silverlightlearning.info
silverlightlearnings.info
silverlighttraining.info
silverlighttrainings.com
silverlighttrainings.info
silverlighttutorial.info
silverlighttutorials.info
sirasende.info
urunbul.info
yagmurca.com
yagmurca.info