2010-05-25 24 views
29

Bir IIS 7.5 sunucusunda çalışan bir ana bilgisayarda ASP.NET 4.0 ile çalışan bir web sitem var, ancak tam güvende.Statik dosyaları IIS 7.5'de ASP.NET form kimlik doğrulamasıyla nasıl korurum?

Site, ziyaretçilere oturum açmalarına ve dosyalarının görüntülenebildiği bir dosya listesine sahip olmalarına ve dosyaların indirilmesini sağlayan basit bir "dosya tarayıcısı" dır. Statik dosyalar (çoğunlukla pdf dosyaları) veri olarak adlandırılan sitede bir alt klasörde bulunur, ör. http://example.com/data/ ...

Site, ASP.NET form kimlik doğrulamasını kullanır.

Soruma göre: ASP.NET altyapısını, veri klasöründeki statik dosyaların isteklerini karşılayacak şekilde nasıl edinebilirim, böylece dosyalar için istek ASP.NET tarafından doğrulanır ve kullanıcılar derin bağlantı kuramazlar. bir dosyaya ve dosyalara sahip olmalarına izin verilmiyor mu?

Saygılarımızla, Egil.

cevap

40

Uygulama havuzu Entegre modda çalışıyorsa, aşağıdakileri yapabilirsiniz.

Aşağıdakileri en üst düzey web.config dosyanıza ekleyin.

<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
    </system.webServer> 

Şimdi dizindeki tüm dosyalar için form kimlik doğrulaması zorlamak için web.config standart ASP.NET izinlerini kullanabilirsiniz.

<system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <authentication mode="Forms" /> 
</system.web> 
+0

Teşekkürler Joel. Bir yorum olsa da. Sitenin kökünde olmayan web.configs'teki "kimlik doğrulama" bölümünü kullanma iznim yoktu, yine de kullanıcılarla çalıştığı görülüyor. Ancak, seçeneğine sahip olduğumda çalışma yapamadım, kimlik doğrulaması yapmazlar, ancak izin verilenler listesine açıkça bir kullanıcı eklediysem ve diğer tüm kimliği doğrulanmış kullanıcıları reddedersem çalışır. WebServer modülleri bölümünde, bu işi rollerin yanı sıra kullanıcılarla yapmak için bir şey eksik mi? –

+0

Ugh, teşekkürler! Bunu anlamak çok zor olmamalıydı. Şimdi benim için çalışıyor. –

+0

Bu, çalışır, ancak giriş sayfasında kullanılan tüm css/gif dosyalarını da engeller. Göstermeleri için herhangi bir yol var mı? – eych

12

Kimlik doğrulamada rol almakla aynı sorunu yaşadım. Deneme yanılma yoluyla Sonunda o Cunningham'ın kodunu @Joel için küçük bir düzenleme ile çalışmak lazım: http://forums.iis.net/t/1177964.aspx ve http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/

+0

Bu çalışma !!!! ;) – NitroxDM

+5

Bu sadece işe yaramaz ve nedenini bilmezsiniz. Bu, tüm yönetilen modüller tüm istekleri yakaladığı için büyük PERFORMANS sorunlarına neden olur. @ John'un çözümleri ihtiyacınız olan şeydir. – Adaptabi

+2

Hey, @DotNetWise ile aynı fikirdeyim. Gerekirse, tüm istekleri için tüm yönetilen modülleri çalıştırmak yerine, tüm istekleri için yürütülecek modülleri kirazla seçtiğinizden emin olun. örn .: - önşartın boş olduğunu fark et. – Anton

9

Bu eski bir iplik olmakla I:

<modules runAllManagedModulesForAllRequests="true" > 

bu iki referans olarak sites kullandı üzerinde oldu ve Egil gibi aynı sorunla karşılaştı. İşte rolleri içerir Joel'in düzeltmenin sürümü:

<modules runAllManagedModulesForAllRequests="false"> 
     <remove name="FormsAuthenticationModule" /> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="RoleManager" /> 
     <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
</modules> 
4

Zeyilname: @eych olarak

~/Content klasöre bu da blokları erişimi kaydetti (veya CSS bulunan her yerden) ve ~/Scripts ve böylece üzerinde.

İstisnalara izin vermek istiyorsanız - bazı dosyalara/klasörlere kimliği doğrulanmamış kullanıcılar tarafından erişilmesine izin vermek istiyorsanız, bunu location öğesi aracılığıyla yapabilirsiniz.

<location path="Content"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 

Güncelleme: Aşağıdaki web.config ekle Daha iyi bir çözüm sağlamaktır varsayılan olarak erişimi üzerinde bırakmak hazır - CSS ulaşmanızı sağlayacak/JavaScript/vs - ve

<location path="data"> 
    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 
</location> 

ihtar:: statik içeriğin depolandığı klasöre (yalnızca) "kilit" uygulamak bizim durumumuzda (MVC sitesinde) bizile (giriş hariç) tüm denetleyici eylemleri süslemek için gerekli.Zaten iyi bir fikir, ama daha önce gerekli değildi (çünkü daha önce herhangi bir izinsiz istek giriş sayfasına yönlendirildi).

6

Neden Entegre Boru Hattı için varsayılan olarak eklenen modüllerin (varsayılan seçeneklerle) yeniden eklenmesinin gerekeceğini bilmek istedim, bu yüzden biraz daha derine kazdım.

Modülleri çıkarmanız ve yeniden eklemeniz gerekir, çünkü varsayılan olarak, modüller varsayılan seçeneklerle eklenmez. Geriye dönük uyumluluk için yalnızca kayıtlı bir ASP.NET işleyicisi tarafından işlenen içerik (örneğin, .aspx sayfaları) için çalıştırılmak üzere bir önşart eklenmiştir.

varsayılan şuna benzer:

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
     preCondition="managedHandler" /> 

modüllerini çıkarıp, tek tek bu modüller (statik içeriği dahil) her istek için yürütülen bir ön koşul olmadan onları yeniden ekleyerek. runAllManagedModulesForAllRequests'u etkinleştirmekten daha ayrıntılıdır.

Sen Entegre Boru Hattı IIS 7 ile tanıştığında bir kaç makalelerinde bu konuda bilgi edinebilir

: bir yazım hatası veya modül olmadığını

Not ikinci makaledeki adı (ve @ John'un cevabı) bir noktada FormsAuthenticationModule'dan FormsAuthentication'a değiştirildi.

benim için böyle 8.5 görünüyor aracılığıyla IIS 7.5 modülleri çalışma grubu:

Uygulama havuzu Klasik modda çalışıyorsa
<system.webServer> 
    <modules> 
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests --> 
    <remove name="FormsAuthentication" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <remove name="DefaultAuthentication" /> 
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    <remove name="RoleManager" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <remove name="UrlAuthorization" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    </modules> 
</system.webServer> 
+0

Açıkça anlaşılabilir, ancak size özel durumunuza bağlı olarak, tüm bu modüllere (örneğin RoleManager'a ihtiyacım yoktu) ihtiyacınız olabilir ve System.Web.SessionState gibi benzer kısıtlamalara sahip başkalarına ihtiyacınız olabilir. SessionStateModule – Shaun

1

, aşağıdakileri yapabilirsiniz. İşlenmek istediğiniz her dosya uzantısı için bu adımları tekrarlamanız gerekecek, ancak burada .html kullanıyorum.

Birincisi, Web.config bir sayfa oluşturma sağlayıcı ekleyin:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" /> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/> 
    </handlers> 
    </system.webServer> 
</configuration> 
:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <httpHandlers> 
     <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/> 
    </httpHandlers> 
    </system.web> 
</configuration> 

Sonra sayfa işleyicisi ekleyin:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <compilation> 
     <buildProviders> 
     <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/> 
     </buildProviders> 
    </compilation> 
    </system.web> 
</configuration> 

Sonra sayfa işleyicisi fabrikası eklemek

Bu benim için çalıştı. (Kredi: http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages.)

İlgili konular