2017-02-03 7 views
0

Я работаю над приложением ASP.Net MVC. Я хочу запретить доступ ко всем пользователям, которые не прошли проверку подлинности или нет в группе AD. Только эта группа AD должна иметь доступ. Исключением является «Вы не пройдете!». стр. Любой может получить доступ к этому.Настройка авторизации и страница с недопустимым доступом

В корне проекта, у меня есть это в моем web.config (остальная часть файла обрезается для краткости):

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <customErrors mode="On"> 
      <error statusCode="401" redirect="/ui/Other/YouShallNotPass.html" /> 
     </customErrors> 
     <compilation debug="true" targetFramework="4.5.2" /> 
     <httpRuntime targetFramework="4.5.2" /> 
     <authentication mode="Windows" /> 
     <authorization> 
      <allow roles="allowedrole"/> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
    <system.webServer> 
     <httpErrors> 
      <remove statusCode="401" /> 
      <error statusCode="401" 
        subStatusCode="2" 
        responseMode="ExecuteURL" 
        path="/ui/Other/YouShallNotPass.html" /> 
     </httpErrors> 
    </system.webServer> 
</configuration> 

У меня есть второй web.config сидит рядом с ui/Other/YouShallNotPass.html. Я ожидаю, что это позволит любому получить доступ к этой странице, проверку подлинности или иным образом:

<configuration> 
    <system.web> 
     <authorization> 
      <allow users="?"/> 
     </authorization> 
    </system.web> 
</configuration> 

Я в состоянии проверить это, установив группу AD на один, который не существует. Я не являюсь частью несуществующей группы, поэтому я должен ожидать увидеть страницу YouShallNotPass.html.

Это не работает должным образом. Я получаю следующую ошибку в своем браузере:

Сообщение об ошибке 401.2 .: Несанкционированное использование. Ошибка входа в систему из-за конфигурации сервера. Убедитесь, что у вас есть разрешение на просмотр этого каталога или страницы на основе предоставленных вами учетных данных и методов проверки подлинности, включенных на веб-сервере.

Если я запрошу непосредственно YouShallNotPass.html, я могу получить к нему доступ после получения запроса для пользователя/прохода.

Что я делаю неправильно? Почему он не будет обслуживать страницу 401, если пользователь не авторизован?

+0

Попробуйте вставить '' в web.config вашего 'YouShallNotPass.html' и посмотреть, что произойдет. Поскольку браузер все еще запрашивает пользователя/пароль, это означает, что на странице по-прежнему требуется проверка подлинности Windows (поскольку вы поместили ее в основной файл web.config и не переопределили ее). – Alisson

+0

Он больше не запрашивает пользователя/пароль, когда я запрашиваю 'YouShallNotPass.html' напрямую. Но любая другая страница, и я до сих пор получаю исходную ошибку. – Amy

+0

Возможно ли, что ваш пользователь пула доступа не имеет доступа к базе данных, на которую вы проверяете подлинность? –

ответ

0

Проверьте это question, потому что это объясняет, почему ваше решение не будет работать.

Поэтому, как только вы перемещаете аннотировать все безопасные действия контроллера с [Авторизоваться] вы можете добавить пользовательский ExceptionFilter

как этот

public class HandleUnauthorizedAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     base.OnException(filterContext); 

     if (filterContext.Exception.GetType() != typeof (SecurityException)) return; 

     var controllerName = (string) filterContext.RouteData.Values["controller"]; 
     var actionName = (string) filterContext.RouteData.Values["action"]; 
     var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

     filterContext.Result = new ViewResult 
     { 
      ViewName = "Unauthorized", 
      ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
      TempData = filterContext.Controller.TempData 
     }; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 403; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
} 

Тогда проводка его здесь

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleUnauthorizedAttribute()); 
    } 
} 
+0

Это применимо в моем случае? 'YouShallNotPass.html' является статическим HTML-файлом. Контроллер не обслуживается. – Amy

+0

Ключом является то, что вы не можете настроить безопасность в Интернете.config, где вы заблокируете весь сайт, затем откройте отверстия с помощью , как вы делали с веб-форматами asp.net. поэтому 1. используйте атрибут authorize на своих действиях контроллера 2. вы можете использовать его customerrors после того, как вы сделаете 1, потому что вы не блокируете все. – Fran

+0

еще одна проблема заключается в том, что вы смешиваете аутентификацию (кто вы) с разрешением (что вы можете сделать) здесь. ошибка аутентификации будет 401. Ошибка авторизации - 403. – Fran

1

Удалось обойти это, добавив следующее в мой global.asax:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.StatusCode != 401) 
     return; 

    Response.ClearContent(); 
    Response.WriteFile("~/ui/Other/YouShallNotPass.html"); 
    Response.ContentType = "text/html"; 
} 

Я бы предпочел использовать web.config для этого.

+0

Пробовали ли вы с помощью элемента '' в главном web.config вместо того, чтобы иметь второй web.config? Это может быть более чистой альтернативой, чем перехват ответа. – mason

+0

Да, я это сделал. Я не могу вспомнить, почему это не сработало сейчас. – Amy

Смежные вопросы