Обновление № 3
Вы можете включить URLAuthorization, чтобы заставить IIS защищать файлы, которые обычно не обрабатываются в IIS.Решение здесь зависит от IIS 7.x и использования встроенных конвейеров.
<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>
Обновлено # 2 Вы можете полностью перейти на проверку подлинности с помощью форм, удалив добавленные вами пользовательские элементы ивыполните следующие действия.
Я на самом деле проверил это, и он позволяет jack in dir1 и jill in dir2 .Оба могут получить доступ к корню.
Если это не сработает, нам нужно обсудить больше ваших настроек.
web.config
<?xml version="1.0"?>
<configuration>
<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>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="Default.aspx">
<credentials passwordFormat="Clear">
<user name="jack" password="jack" />
<user name="jill" password="jill" />
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
<compilation debug="true"></compilation>
<customErrors mode="Off"/>
</system.web>
<location path="dir1">
<system.web>
<authorization>
<allow users="jack" />
<deny users="*, ?" />
</authorization>
</system.web>
</location>
<location path="dir2">
<system.web>
<authorization>
<allow users="jill" />
<deny users="*, ?" />
</authorization>
</system.web>
</location>
</configuration>
Login.aspx - Вы должны добавить перенаправление из элемента управления Login, потому что в противном случае проверка подлинности с помощью форм будет искать базу данных в каталоге App_Code, которая не существует.
<asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate">
</asp:Login>
Login.aspx.cs
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string username = Login1.UserName;
string password = Login1.Password;
if (FormsAuthentication.Authenticate(username, password))
{
FormsAuthentication.RedirectFromLoginPage(username, false);
}
}
Update # 1
Я рассмотрел пример, который вы связали как обычную базовую аутентификациюМодуль HTTP и затем следуют до Модуль HTTP , который в самом низу имеет ссылку на дополнительный источник.
Этот источник имеет пример поставщика членства, использующий обычную базовую аутентификацию.Я чувствую, что вы сталкиваетесь с проблемами, смешивая провайдера членства в Forms, который есть у вас в web.config.
Когда вы начинаете делать свою собственную отдельную аутентификацию, дела идут плохо, и выобычно нужно добавить все по своему.
Этот код работает от этой дополнительной ссылки на моем конце.
В качестве дополнительной возможности, если вы хотите, чтобы ASP.NET обрабатывал всесамо членство, и вы используете SQL для хранения всего, рассмотрите http://weblogs.asp.net/sukumarraju/archive/2009/10/02/installing-asp-net-membership-services-database-in-sql-server-expreess.aspx, чтобы увидеть, как использовать мастер для настройки его в SQL.
Встроенное членство будет проверкой подлинности с помощью форм и будетнамного меньше работы, чем при использовании custom.
Предыдущая версия
Мне никогда не везло с использованием тегов <location>
, поэтому я просто поместил новые web.configs вкаталоги.У меня также были проблемы, когда я не исключал анонимных в подпапках.Похоже, что по умолчанию браузер использует анонимный доступ через
Вот как я это делаю.
Root web.config
<system.web>
<authorization>
<allow roles="AccessRole1, AccessRole2" users="domain\jack, domain\jill"/>
<deny users="*, ?" /> <!-- make sure you deny anonymous with '?' -->
</authorization>
</system.web>
Подкаталог web.config.Убедитесь, что вы явно отказываете всем остальным пользователям.Если вы не запретите всем другим пользователям, они все равно могут войти.
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow users="domain\jill" />
<deny users="*, ?"/> <!-- explicitly deny all others, including anonymous -->
</authorization>
</system.web>
</configuration>