Базовая проверка подлинности IIS7 для защиты сайта, использующего проверку подлинности с помощью форм - PullRequest
16 голосов
/ 19 октября 2010

Это должно быть намного проще, чем оказалось!

У меня есть веб-приложение ASP.Net, которое использует аутентификацию FORMS для защиты части сайта (то есть зоны входа пользователя).

Теперь я просто хочу разместить традиционное / простое всплывающее окно с паролем браузера (безопасность каталога) по всему сайту, потому что мы его тестируем и не хотим, чтобы кто-нибудь наткнулся на сайт и увидел незаконченную версию и т. Д.

Раньше это было очень просто в старых версиях IIS.

У меня установлена ​​«базовая аутентификация» (поскольку IIS7 не поставляется с этим сейчас).Но когда я включаю его, он говорит мне, что я не могу включить его одновременно с какой-либо аутентификацией на основе перенаправления (именно это использует моя аутентификация FORMS).

Так что это просто глупо.

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

Большое спасибо..

ОБНОВЛЕНИЯ Ограничения доступа к IP не годятся по нескольким причинам: - Мой IP динамический и поэтому постоянно меняется.- Я не хочу беспокоить кого-либо, кому необходимо посетить сайт, попросив его установить консоль на своей машине и определить свой IP-адрес или проверить свой маршрутизатор и т. Д. Многие из них являются нетехническими бизнес-пользователями, и это будетПотратьте час, чтобы определить их IP-адрес.- И базовая аутентификация, и аутентификация Windows не позволяют базовой аутентификации форм оставаться на своем месте.

То, что мы видим здесь, это массивный случай, когда Microsoft пытается чрезмерно спроектировать вещи, и в результатесупер простые возрастные требования больше не возможны или легко достижимы.Это должно быть как-то возможно ... НИКТО ???

Ответы [ 3 ]

5 голосов
/ 28 апреля 2011

Я сталкиваюсь с той же проблемой. Я буду размещать бета-сайт, ограниченный группой предварительного просмотра. Веб-сайт использует проверку подлинности с помощью форм, но некоторые люди из группы предварительного просмотра будут иметь учетные записи на веб-сайте, а другие - нет. Независимо от того, что каждый должен будет пройти аутентификацию root, чтобы получить доступ к предварительному просмотру.

Пока единственное, что у меня работает именно так, как я хочу, это Helicon Ape Я провожу пробную версию и пока все хорошо.

Стандартный файл .htaccess в корне.

AuthUserFile c:\fakepath\.htpasswd
AuthType Basic
AuthName "SITE SECURITY"
Require valid-user

Пользователь .htpasswd для добавления имени пользователя и пароля: username:encryptedpassword.

3 голосов
/ 19 января 2015

То, что вы описываете, является ограничением по умолчанию ASP.NET, он предназначен только для запуска одного модуля аутентификации за раз.Решение состоит в том, чтобы создать свой собственный IHttpModule , который выполняет пользовательскую аутентификацию, и в случае успеха передать запрос ASP.NET, который продолжает использовать формы.такой модуль.Он вернет 401 Unauthorized и попросит пользователя войти в царство WOPR.Затем он примет пароль Joshua, игнорируя указанное имя пользователя.

Скомпилируйте это как отдельную сборку и добавьте ее в ваш web.config, в разделах system.web/httpModules и system.webServer/modules.Никаких других изменений вашего веб-приложения не требуется.

using System;
using System.Text;
using System.Web;

namespace Research {
    public class AuthenticationModule : IHttpModule {
        public void Init(HttpApplication app) {
            app.BeginRequest += (sender, e) => {
                if (!Authenticate(app.Context)) {
                    app.Context.Response.Status = "401 Unauthorized";
                    app.Context.Response.StatusCode = 401;
                    app.Context.Response.AddHeader("WWW-Authenticate", "Basic realm=WOPR");

                    app.Response.ClearContent();
                    app.Context.Response.End();
                }
            };
        }

        public void Dispose() {
        }

        public static Boolean Authenticate(HttpContext context) {
            var authHeader = context.Request.Headers.Get("Authorization");
            if (String.IsNullOrEmpty(authHeader))
                return false;

            if (!authHeader.StartsWith("Basic "))
                return false;

            var base64Credentials = authHeader.Substring(6);
            var binaryCredentials = Convert.FromBase64String(base64Credentials);
            var asciiCredentials = Encoding.ASCII.GetString(binaryCredentials);
            if (!asciiCredentials.Contains(":"))
                return false;

            var credentials = asciiCredentials.Split(new[] { ':' }, 2);
            return credentials[1] == "Joshua";
        }
    }
}
2 голосов
/ 21 марта 2011

Для вас есть простое решение, так как вы хотите использовать аутентификацию FORMS ...

  1. Добавьте этот раздел в ваш web.config под основным заголовком. Не объединяйте его - просто скопируйте и вставьте его как один блок. Тег местоположения изолирует эти правила от остальной части файла web.config и позволит легко удалить его позже.

     <location allowOverride="false">
                 <system.web>
                     <authentication mode="Forms">
                         <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH">
                         </forms>
                     </authentication>
                     <authorization>
                         <deny users="?" />
                     </authorization>
                 </system.web>
             </location>
    
  2. Создайте страницу с именем "frontdoor.aspx". Получить содержимое этой страницы aspx можно по этой ссылке: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (прокрутите вниз до того места, где написано: «Чтобы создать страницу входа»)

  3. ВСЕ СДЕЛАНО! Это заблокирует весь ваш сайт и позволит вам указать имя пользователя и пароль (я называю этот процесс «запирание входной двери») для входной двери независимо от остальной части сайта. Полномочия входной двери указаны в самом файле входной двери (не очень надежном, но достаточно хорошем для того, что вам (нам)) нужно в следующем условии:

    [Строка 6:]

    If ((UserEmail.Text = "TheSharedFrontDoorLogonName") And (UserPass.Text = "AndItsPassword")) Then
    

Измените условное обозначение в соответствии с вашими потребностями, а затем отправьте по электронной почте своим клиентам / бизнес-учетные данные на входную дверь.

...