Web.config разрешает доступ к местоположению для определенного пользователя - PullRequest
10 голосов
/ 03 апреля 2012

У меня есть веб-сервер, с которого пользователи могут загружать файлы, специфичные для каждого пользователя.Чтобы быть уверенным, что каждый пользователь может загружать только свои собственные файлы, он должен пройти аутентификацию через Basic-Authentication .Таким образом, для каждого пользователя на сервере есть учетная запись Windows, которая имеет разрешения на чтение для определенной папки пользователя.

Теперь я хочу перенести эту функцию на другой сервер.Я не хочу создавать учетные записи Windows для пользователей, но все еще сохраняю базовую аутентификацию.Поэтому я использую Пользовательский модуль базовой аутентификации HTTP в сочетании с Пользовательским MembershipProvider , который позволяет мне определять пользователей в web.config.

Аутентификация работает довольно хорошо, нопосле входа в систему с помощью jack или jill (см. web.config) я могу получить доступ к обоим местоположениям Dir1 и Dir2.Это также имеет место, если я закомментирую часть <allow users="jack" /> в тегах местоположения.

Дополнительная информация: я создал файл Default.aspx и добавил

<% Response.Write(HTTPContext.Current.User.Identity.Name) %>

, который возвращаетправильное имя пользователя в зависимости от того, кто вошел в систему.

<% Response.Write(HTTPContext.Current.User.Identity.IsAuthenticated) %>

возвращает значение True.

Что мне нужно сделать, чтобы только jack имел доступ (= загрузка файлов из) Dir1 и только jill может получить доступ (= загрузить файлы из) Dir2, но не наоборот?

РЕДАКТИРОВАТЬ: я пытался добавить файлы web.config для каждогоподкаталоги вместо тегов местоположения, упомянутых utkai, - с тем же результатом.Каждый пользователь может получить доступ к любому каталогу.

Вот мой файл Web.config:

<configuration>
<system.webServer>
    <modules>
        <add name="CustomBasicAuthentication" type="LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule, LeastPrivilege.CustomBasicAuthenticationModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=F20DC168DFD54966"/>
    </modules>

    <security>
        <authentication>
            <customBasicAuthentication enabled="true" realm="TEST" providerName="AspNetWebConfigMembershipProvider" cachingEnabled="true" cachingDuration="15" requireSSL="false"/>
        </authentication>
        <authorization>
            <deny users="?" />
        </authorization>
    </security>
</system.webServer>

<system.web>
    <membership defaultProvider="AspNetWebConfigMembershipProvider">
        <providers>
            <add name="AspNetWebConfigMembershipProvider" type="LeastPrivilege.AspNetSecurity.Samples.WebConfigMembershipProvider, WebConfigMembershipProvider"/>
        </providers>
    </membership>

    <authentication mode="Forms">
        <forms>
            <credentials passwordFormat="Clear">
                <user name="jack" password="jack"/>
                <user name="jill" password="jill"/>
            </credentials>
        </forms>
    </authentication>

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

<location path="Dir1" allowOverride="false">
    <system.web>
        <authorization>
            <!-- <allow users="jack" /> -->
            <deny users="*" />
        </authorization> 
    </system.web>
</location>

<location path="Dir2"  allowOverride="false">
    <system.web>
        <authorization>
            <!-- <allow users="jill" /> -->
            <deny users="*" />
        </authorization> 
    </system.web>
</location>
</configuration>

Ответы [ 5 ]

9 голосов
/ 02 мая 2012

Обновление № 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>
2 голосов
/ 03 апреля 2012

Вот ссылка на хорошую статью с подробным описанием нескольких ситуаций, в которых можно разрешить / запретить доступ к определенной странице или папке:

Настройка правил авторизации для определенной страницы или папки в web.config

В качестве дополнительного комментария, в одном проекте, который мы делаем, мы используем опцию отдельного файла web.config в каждой папке, как указано в ссылке, и он прекрасно работает для нас.

Надеюсь, это поможет решить вашу проблему.

0 голосов
/ 02 мая 2012

Установите следующее в вашем Web.config

<modules runAllManagedModulesForAllRequests="false">

Поместите следующее событие в ваш файл Global.asax.

protected void Application_BeginRequest(Object sender, EventArgs e)
{
}

Теперь всякий раз, когда вы печатаетеURl, как показано ниже.

http://localhost/dir1/jack.txt

Элемент управления всегда будет перемещаться к событию Application_BeginRequest.У вас есть Request.Url информация и Current User information, и вы можете выполнить проверку здесь.

Используя приведенный ниже код

throw new HttpException(403,"Acess Denied");

или отправьте пользователя на другую страницус некоторым удобным сообщением.

0 голосов
/ 30 апреля 2012

Используйте это пошаговое руководство, чтобы применить тег к файлу Web.config для настройки доступа к определенному файлу и папке.

<location path="default1.aspx">
    <system.web>
        <authorization>
            <allow users ="*" />
        </authorization>
    </system.web>
</location>
<!-- This section gives the unauthenticated user access to all of the files that are stored in the Subdir1 folder.  -->
<location path="subdir1">
    <system.web>
        <authorization>
            <allow users="Admin" />
        </authorization>
    </system.web>
</location>

Подробнее ...

0 голосов
/ 29 апреля 2012

этот подход похож, но отличается - местоположение - это файл, а не каталог:

Можно ли разрешить анонимному пользователю просматривать только несколько файлов из папки

...