Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, ASP.NET'de yaygın izin ve güvenlikle ilgili sorunların nasıl giderileceğini tanıtır.
Özgün ürün sürümü: ASP.NET
Özgün KB numarası: 910449
Yararlı araçlar
Bozuk bir şeyi düzeltmeye çalışmadan önce, sorunu daraltmanıza yardımcı olacak birkaç araç hakkında bilgi sahibi olmanız gerekir. Bizim örneğimizde FileMon, RegMon ve Güvenlik Denetimi gibi araçlarla ilgileneceğiz. FileMon hakkında daha fazla bilgi için bkz . Windows v7.04 için FileMon.
RegMon hakkında daha fazla bilgi için bkz . Windows Sysinternals.
Sorunu yalıtmak için detaya gitme
- Uygulama hiç çalıştı mı? Evet ise, uygulamanın bozulmasına neden olabilecek değişiklik ne olabilir? Sunucuya yazılım güncelleştirmeleri veya güvenlik güncelleştirmeleri uygulanmış olabilir. Soruna bir kod dağıtımı da neden olmuş olabilir.
- Basit .html ve .asp sayfaları IIS'den mi hizmet sağlar?
- Uygulama farklı bir IIS sürümüne geçirildi mi?
- Sunucudaki diğer ASP.NET uygulamaları aynı hatayla başarısız mı oluyor? Başarısız olan tek uygulama bu mu?
- Sorun tüm kullanıcılar için mi yoksa yalnızca belirli kullanıcılar için mi oluşuyor?
- Sorun Web sunucusunda yerel olarak gezinirken yeniden üretilebilir mi yoksa yalnızca birkaç istemci için yeniden üretilebilir mi?
- Kimliğe bürünme kullanıyorsanız, kimliğine bürünülen kullanıcının kaynağa gerekli erişimi var mı?
Yukarıdaki sorular, bir sorunu tanılamak için yararlıdır. Sorununuzu ASP.NET forumlarından herhangi birinde yayınlıyorsanız ve bu soruların çoğunu zaten yanıtlıyorsanız, büyük olasılıkla sorununuza hızlı bir işaretçi veya çözüm bulacaksınız. Anahtar, "ASP.NET uygulamamı çalıştırmaya çalışırken Erişim Reddedildi hatası alıyorum" demek yerine varsa tüm ASP.NET yığın izleme hatasını göndermektir. Yardım edebilir misiniz?" Birinin yığın izlemesine bakabilmesi ve tam bir hata iletisi görebildiğinde size işaretçiler vermesi daha kolaydır. Bu yüzden kendinize sormanız gerekir...
Hata iletisinde tam olarak ne yazıyor?
Müşterilere sorduğumuz ilk soru şudur: "Tam hata iletisi nedir?" Microsoft .NET Framework tarafından oluşan hata iletisinin net bir açıklamasınız varsa, bu bölümü atlayabilirsiniz. Uygulamanız gerçek hata iletisini maskeler ve bunun yerine size "Beklenmeyen bir hata oluştu. Ayrıntılar için web sitesi yöneticisine başvurun." ifadesinin kimseye pek bir anlamı yok. Burada, gerçek hata iletisini almanıza yardımcı olacak birkaç adım yer alır.
Web.config dosyasını uygulama dizininde bulup açın ve customErrors değerini mode="Off" olarak değiştirin. Dosyayı kaydedin ve sorunu yeniden oluşturun.
Uygulama geliştiricisi tarafından gerçekleştirilen özel olay/hata işleme nedeniyle yukarıdaki adımdan sonra gerçek hata iletisini görmek yine de mümkün olmayabilir. Global.asax dosyasında Application_Error olayını bulmayı deneyebilir ve özel bir hata sayfasına gitmek için işlevini kullanan
Server.Transfer("Errors.aspx")
herhangi bir kodu açıklama satırı yapabilirsiniz.//Global.asax void Application_Error(object sender, EventArgs e) { // Code that runs when an unhandled error occurs //Server.Transfer("Errors.aspx"); }
Gerçek hata iletisini aldıktan sonra, hatanın yerel bir kaynakta veya ASP.NET uygulamanızın erişmeye çalıştığı uzak bir kaynakta eksik izinlerden kaynaklandığını belirlemek için okuyun.
İpucu
Gerçek hata iletisini nasıl göreceğinizi öğrenmek için geliştiricinize başvurabilirsiniz. Geliştiriciniz bunu bir log dosyasına kaydediyor veya e-posta bildirimleri alıyor olabilir. Değiştireceğin herhangi bir dosyanın yedeğini oluşturmayı her zaman unutmayın. Bir yedekleme kullanılabilir durumdaysa, değişiklikleri istediğiniz zaman geri alabilirsiniz.
Sorun, ASP.NET uygulamasının erişmeye çalıştığı yerel bir kaynakta eksik izinler nedeniyle oluşur
Özel bir hata iletisi nedeniyle sorunun net bir açıklamasını alamıyorsanız, FileMon'u çalıştırın ve sorunu yeniden oluşturun. Yakalamayı durdurun ve FileMon.xls olarak kaydedin ve dosyayı Microsoft Excel'de açın.
Veri menüsünde Filtre'yi seçin ve ardından Excel'in filtreleme özelliklerini kullanmak için Otomatik Filtre'yi seçin. Şimdi sütun F
'deki açılır listeyi seçin ve "Erişim Reddedildi" hatalarını arayın.
Aşağıda örnek bir FileMon çıkışı gösterilmiştir.
10381 1:01:11 PM w3wp.exe:2320 OPEN C:\winnt\microsoft.net\framework\v1.1.4322\Temporary ASP.NET Files\sessiontest\8832e585\275ec327\global.asax.xml
ACCESS DENIED NT
AUTHORITY\NETWORK SERVICE
Filtrelenen sonuçlardan görebileceğiniz gibi sorunun nedenini daralttık. FileMon, NT AUTHORITY\NETWORK SERVICE hesabının C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files
klasörüne NTFS izinlerinin eksik olduğunu belirtiyor. Bunu düzeltmek oldukça basit olmalı.
İpucu
sorunu giderip gidermediğini görmek için ASP.NET işlem hesabını bir Yönetici hesabıyla değiştirmek iyi bir adım olabilir. IIS 6.0 ve sonraki sürümlerde, uygulamanın çalışıp çalışmadığını görmek için IIS AppPool kimliğini "Yerel Sistem" olarak değiştirirsiniz.
Not
Bu, çözüm olarak değil, yalnızca sorun giderme adımı olarak kullanılmalıdır.
Çoğu kişi Microsoft .NET Framework'i yeniden yükleme eğiliminde olabilir, hatta işletim sistemini yeniden yükleme kapsamına bile gidebilir. Bu önerilen bir sorun giderme adımı değildir ve sorunun tekrarlanmayacağını garanti etmez. Böyle bir örnek vereceğim. Aralıklı sorunları yalıtmak ve gidermek genellikle zordur. Bu senaryoda müşterinin uygulaması birkaç saat boyunca sorunsuz çalışır ve sonra aniden aşağıdaki hatayla başarısız olur. Müşteri zaten .NET Framework ve işletim sistemini yeniden yüklemeyi denemişti. Bu, sorunu birkaç gün düzeltmiş gibi görünüyordu, ancak sonra yeniden göründü.
FileMon çalıştırıldığında ERIŞIM REDDEDILDI hatası gösterilmiyor. ASPNET hesabı için gerekli tüm izinler yerindeydi. Sorundan kurtulmanın tek yolu kutuyu yeniden başlatmaktır. IIS sıfırlaması bile yardımcı olmaz. "Ah, Microsoft Software'in kurtarılması için her zaman yeniden başlatma gerekiyor mu?" diye düşünüyorsunuz. Evet, yanılıyorsunuz!
Buradaki anahtar, hata iletisine yakından bakmaktır. Hatanın her zamanki ACCESS DENIED hatası yerine "dosya yazmak için açılamıyor" olduğu açıkça belirtiliyor. Bu nedenle, dosya veya klasörde kilit tutan ve ASP.NET yazmasına izin verilmeyen başka bir işlem olduğunu düşünüyorum. Yeniden başlatmanın diğer işlemi sonlandırdığını ve ASP.NET uygulamasının, düzenbaz işlem dosyayı yeniden kilitleyene kadar yeniden çalışmaya başlaması mantıklıdır. Yapılacak mantıksal şey, tüm virüsten koruma programlarını, üçüncü taraf casus yazılımları veya sunucuda çalışan diğer dosya izleme yazılımlarını kapatmaktır. Belirli bir üçüncü taraf yazılımına işaret etmek istemiyorum. Ancak genel olarak virüsten koruma yazılımının IIS ve ASP.NET uygulamaları için çok fazla sıkıntıya neden olduğu bilinmektedir. Virüsten koruma yazılımının neden olduğu bilinen bir diğer sorun da, Bin klasörüne veya .config dosyalarına dokunulduğunda AppDomain geri dönüşümlerinden kaynaklanan oturum kaybıdır.
İpucu
Üçüncü taraf hizmetlerini kapatmanın en kolay yolu:
- Başlat'ı seçin, Çalıştır'ı seçin ve ardından msconfig yazın.
- Hizmetler'i seçin ve Tüm Microsoft Hizmetlerini Gizle'yi işaretleyin.
- Üçüncü taraf hizmetleri durdurmak için Tümünü Devre Dışı Bırak'ı seçin.
- Başlat'ı seçin, Çalıştır'ı seçin ve ardından CLR'yi çalışan işlemine yeniden yüklemek için iisreset yazın.
Sorunun tekrar olup olmadığını görmek için uygulamanızı izleyin. Birden çok virüsten koruma programı çalıştırıyorsanız, soruna hangi programın neden olduğunu belirlemek için deneme ve hata yöntemini kullanın.
Not
Aynı hata yüzde 100 yeniden üretilebilirse, bunun nedeni virüsten koruma yazılımınız olmayabilir. Bu hatanın başka nedenleri de olabilir. Bir Test.aspx sayfasında aynı hatanın oluşup oluşmadığını yalıtmak için basit bir ASP.NET test uygulaması oluşturmayı deneyin. Varsa, ASP.NET için gerekli Erişim Denetim Listelerinin (ACL) tümünün yerinde olduğunu doğrulayın.
Bkz. Gerekli Erişim Denetim Listeleri (ACL'ler) ASP.NET.
İpucu
Klasör %SystemRoot%\Assembly
, genel derleme önbelleğidir. Bu klasörün ACL'lerini düzenlemek için Windows Gezgini'ni doğrudan kullanamazsınız.
Bunun yerine, bir komut istemi kullanın ve aşağıdaki komutu çalıştırın:
cacls %windir%\assembly /e /t /p domain\useraccount:r
Alternatif olarak, Windows Gezgini'ni kullanmadan önce GUI aracılığıyla izin vermek için aşağıdaki komutla Shfusion.dll kaydını kaldırın:
C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32-u shfusion.dll
Windows Gezgini ile izinleri ayarladıktan sonra, aşağıdaki komutla Shfusion.dll yeniden kaydedin:
C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32 shfusion.dll
Sorun, ASP.NET uygulamasının erişmeye çalıştığı uzak bir kaynakta eksik izinler nedeniyle oluşur
ASP.NET uygulamanız Microsoft SQL Server veya Evrensel Adlandırma Kuralı (UNC) paylaşımı gibi uzak bir kaynağa eriştiğinde, ters gidebilecek birçok şey vardır. Ayrıca, uzak kaynakta birçok şey yanlış ayarlanmış olabilir. Kaynağın çalışmasını sağlamak için bu sorunları gidermeniz gerekir.
İlk adımınız, Windows Gezgini aracılığıyla uzak sunucuya bağlanıp bağlanamadığını görmek olacaktır.
Uzak sunucuda Test adlı bir klasör oluşturun. Test klasörünün Paylaşım ve Güvenlik sekmelerinde etki alanınızı/hesabınızı ve ASP.NET uygulamanız tarafından kullanılan işlem hesabını ekleyin ve her ikisine de Tam Denetim verin.
IIS sunucusunda, etki alanınızla/hesabınızla oturum açın, Başlat'ı seçin, Çalıştır'ı seçin ve ardından uzak sunucunun UNC paylaşım yolunu yazın:
\\RemoteServerName*\Test
.Bu klasöre ulaşamıyorsanız bu sorunu çözmek için Ağ Yöneticinize başvurun. Ancak o zaman ASP.NET uygulamanız paylaşıma erişebilir.
Aşağıdaki kodla CreateUNCFile.aspx adlı bir dosya oluşturun ve dosyayı uygulama dizininize kaydedin.
<%@ Page Language="vb" %> <%@ Import Namespace="System.IO" %> <html> <head> <title>Writing to a Text File</title> <script runat="server"> Sub WriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim fp As StreamWriter fp = File.CreateText("\\<RemoteServerName>\Test\" & "test.txt") fp.WriteLine(txtMyFile.Text) lblStatus.Text = "The File Successfully created! Your ASP.NET process is able to access this remote share" fp.Close() End Sub </script> </head> <body style="font: 10pt verdana"> <h3 align="center">Creating a Text File in ASP.NET</h3> <form id="Form1" method="post" runat="server"> Type your text: <asp:TextBox ID="txtMyFile" TextMode="MultiLine" Rows="10" Columns="60" Runat="server" /><br> <asp:button ID="btnSubmit" Text="Create File" OnClick="WriteToFile" Runat="server" /> <asp:Label ID="lblStatus" Font-Bold="True" ForeColor="#ff0000" Runat="server" /> </form> </body> </html>
Aşağıdaki kod satırında RemoteServerName'i<>emin olun
fp = File.CreateText("\\<RemoteServerName>\Test\" &"test.txt")
Böylece uzak sunucunuzun adını yansıtır.
Windows Internet Explorer'ı açın ve IIS sunucusu dışındaki bir istemci bilgisayardan
http://**IISServerName**/**AppName**/CreateUNCFile.aspx
adresine göz atın.Test.txt dosyası başarıyla oluşturulursa, ASP.NET uygulamanız uzak kaynakta kimlik doğrulaması yapabilir.
İnternet Explorer tarayıcıdan dosya oluşturma işlemi başarısız oluyorsa ancak IIS sunucusunun kendisinden aynı sayfaya göz attığınızda çalışıyorsa, büyük olasılıkla bir "Çift Atlama" senaryosuyla karşılaşıyorsunuz demektir. Kullanıcı kimlik doğrulaması ve yetkilendirme gerektiren uzak kaynaklara erişmek için özel oluşturulmuş Web Bölümleri kullanıyorsanız büyük olasılıkla "Çift Atlama" sorunuyla karşılaşırsınız. Uzak kaynağınıza erişmek için, kaynaktan gelen çıkışın son kullanıcının erişim iznine sahip olduğu verilerle sınırlı olması için kaynağa son kullanıcının kimlik bilgilerini sağlamanız gerekebilir.
Yukarıdaki adımlarda, IIS'de NTLM Kimlik Doğrulaması'nın açık olduğu varsayılır. Temel Kimlik Doğrulaması Kerberos kullanmaz.
Daha fazla bilgi için bkz . Internet Explorer'da Kerberos hatalarını giderme.
IIS kimlik doğrulama yöntemleri hakkında daha fazla bilgi için bkz . Visual Studio 2003 Kullanımdan Kaldırılacak Teknik belgeler.
İpucu
Uzak UNC paylaşımına bağlanabiliyorsanız ancak ASP.NET uygulamasından SQL Server çalıştıran uzak sunucuya bağlanamıyorsanız, SQL Server için Hizmet Asıl Adlarını (SPN) denetlemeniz veya ayarlamanız gerekebilir. IIS'de uygulamanız için yalnızca Temel Kimlik Doğrulaması'nı etkinleştirmeyi deneyin ve SQL Server çalıştıran uzak sunucuya bağlanıp bağlanamadığınıza bakın.
"Sunucu Uygulaması Kullanılamıyor" hata iletisinin başka birçok nedeni vardır. Olay günlüğü, sorununuzun nedeni hakkında daha fazla ayrıntı almak için en iyi seçeneğinizdir.
IIS ile ilgili hatalar
IIS günlükleri, IIS kimlik doğrulamasıyla ilgili hatalarda kullanışlıdır.
Bu hatanın durum ve alt durum kodlarını aramanız gerekir.
2006-10-12 22:47:28 W3SVC1 65.52.18.230 GET /MyAPP/login.aspx - 80
MyDomain\UserID_91 65.52.22.58 Mozilla/4.0+
(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1) 401 3 5
Alt durumu 3 olan ve "Kaynakta ACL nedeniyle yetkisiz" ifadesini gösteren bir 401 görüyoruz.
Bu, bir dosya veya klasör üzerinde eksik NTFS izinlerini gösterir. Erişmeye çalıştığınız dosya için izinler doğru olsa bile bu hata oluşabilir, ancak diğer SYSTEM ve IIS klasörlerinde varsayılan izinler ve kullanıcı hakları eksik olabilir. Örneğin, IUSR_ComputerName hesabının C:\Winnt\System32\Inetsrv dizinine erişimi yoksa bu hatayı görebilirsiniz.
İpucu
Başlat'ı seçin, Çalıştır'ı seçin ve ardından logfiles yazarak IIS günlüklerini içeren klasörü açın. Alternatif olarak, IIS'deki Web Sitenizin özellikler sayfasında WebSiteAdı sekmesini seçin ve Etkin günlük biçimi'nin altında Özellikler'i seçerek Günlük dosyası dizinini ve adını görebilirsiniz.
Burada ilgi çekici olan bir diğer şey de durum kodu 5'tır. Bu durum kodu hakkında daha fazla bilgi edinmek için net helpmsg komutunu kullanabilirsiniz:
C:\Documents and Settings\User> net helpmsg 5
Erişim reddedildi.
Şimdi başka bir ortak durum kodu olan kod 50'yi deneyelim:
C:\Documents and Settings\User> net helpmsg 50
İstek desteklenmiyor.
İpucu
Başka bir genel kötü amaçlı "500 İç Sunucu Hatası" iletisi aldığınızda, kolay HTTP hata iletilerini devre dışı bırakmak iyi bir fikirdir; böylece hatanın ayrıntılı açıklamasını alabilirsiniz. Daha fazla bilgi içerebileceği için olay görüntüleyicisine bakmayı unutmayın.
Mevcut tüm kayıtlı bilgileri kullanarak, karşılaşılan sorun hakkında en fazla ayrıntıyı elde etmek fikridir.
Kaynaklar
Daha fazla bilgi için bkz.