ASP.NET MVC - простой способ временно потребовать авторизацию для всего сайта, кроме одной страницы - PullRequest
3 голосов
/ 19 января 2011

Я создаю сайт со смесью общедоступных страниц и страниц только для членов.Система входа работает нормально, как есть.

Однако я хотел бы запустить закрытый предварительный просмотр только для приглашений и временно требовать, чтобы посетители входили для всех действий, кроме страницы приветствия.У меня есть [Authorize] атрибуты для определенных методов действия.Я мог бы добавить дополнительные атрибуты и к другим методам действий, но это выглядит немного странно, и позже мне будет трудно их правильно удалить, когда я захочу вернуться к более открытому контенту.эффективно добавить требование авторизации для всего сайта?Напомним, что я хочу, чтобы единственный маршрут /Home/Index также оставался общедоступным, чтобы приглашенные мной люди могли прочитать некоторую информацию, прежде чем активировать свои приглашения.

Ответы [ 3 ]

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

Я думаю, лучше всего сделать это в файле web.config, поскольку он временный и не требует добавления кода C# или использования ролей / имен и т. Д.

Выполните следующие действия в вашем web.config

<configuration>
      <!-- system.web is the only already in your web.config 
           don't add this, just add the authorization element
           to the existing system.web element -->
  <system.web>
     <authorization>
        <deny users="?"/>
     </authorization>
  </system.web>

  <!-- the login path -->
  <location path="Login/Index">
     <system.web>
        <authorization>
           <allow users="?"/>
        </authorization>
     </system.web>
  </location>

  <!-- welcome page -->
  <location path="Home/Index">
     <system.web>
        <authorization>
           <allow users="?"/>
        </authorization>
     </system.web>
  </location>

  <!-- static files (images, css, js etc.) folder -->
  <location path="Content">
     <system.web>
        <authorization>
           <allow users="?"/>
        </authorization>
     </system.web>
  </location>

</configuration>

Первый элемент <authorization> ограничит доступ к вашему приложению только авторизованным пользователям. Последующие элементы <location> помещают исключения в определенные пути (страница входа, экран приветствия и статические файлы).

Убедитесь, что вы правильно указали атрибут path для каждого местоположения в зависимости от вашего приложения.

Некоторые дополнительные сведения об элементе location можно найти по адресу MSDN «элемент location» .

2 голосов
/ 19 января 2011

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

public class PreviewAuthAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // if site is live, show page 
        if (Data.Settings.IsLive) return;

        // if request is from localhost or build server, show page
        if (filterContext.HttpContext.Request.IsLocal) return;
        if (filterContext.HttpContext.Request.UserHostAddress.StartsWith("192.168.0")) return;

        // if user has has alpha or admin role, show page
        if (filterContext.HttpContext.Request.IsAuthenticated && (filterContext.HttpContext.User.IsInRole("Alpha") || filterContext.HttpContext.User.IsInRole("Admin"))) return;

        // site is not live and user does not have access - show placeholder

        filterContext.Result = new ViewResult()
        {                
            ViewName="Placeholder",
            ViewData = filterContext.Controller.ViewData,
            TempData = filterContext.Controller.TempData
        };
    }

}
1 голос
/ 19 января 2011

Вы можете настроить атрибут Authorize, и ваш список пользователей для приватной бета-версии должен передать некоторую логику. Просто удалите настройку, когда вы выходите в открытый доступ.

Ответ переполнения стека о том, как настроить атрибут Authorize

Посмотрите на ответ, содержащий AuthorizeOwnerAttribute тоже.

...