Проверка подлинности Asp .net MVC 2 формы не работает на IIS 6. Нужно помогает определить правильные маршруты - PullRequest
1 голос
/ 26 июля 2010

Я пытаюсь настроить проверку подлинности с помощью форм в приложении asp.net mvc 2, которое будет размещено на IIS 6. В маршрутизации есть проблема, но я не могу точно определить, где она находится.

Вот записи маршрута, которые я использую для маршрутизации запросов mvc через обработку aspx на IIS 6. Это может или не может быть "правильным" способом, но в настоящий момент они работают на сервере.

        routes.MapRoute(
            "Default",
            "{controller}.aspx/{action}/{id}",
            new { action = "LogOn", id = "" }
          );

        routes.MapRoute(
          "Root",
          "",
          new { controller = "Main", action = "LogOn", id = "" }
        );

Я поставил атрибут [Authorize] на моем главном контроллере.

В моем web.config у меня есть:

    <authentication mode="Forms">
        <forms  loginUrl="~/Main.aspx/LogOn" timeout="2880"/>
    </authentication>

Когда приложение запускается, загружается пустая страница. Страница буквально пуста. Я не нашел способа изменить loginUrl для фактического выполнения действия LogOn & View для моего главного контроллера.

Отредактировано

Так же, как к вашему сведению, я настроил свою маршрутизацию на основе этой статьи, чтобы маршрутизация mvc могла работать на IIS 6.

http://www.asp.net/mvc/tutorials/using-asp-net-mvc-with-different-versions-of-iis-cs

Я предполагаю, что проблема здесь в том, что настройки проверки подлинности окон не синхронизируются с настройкой маршрутов, поэтому приложение может работать на IIS 6 через расширение aspx.

У кого-нибудь есть мысли о том, как я могу это исправить?

Редактировать 2

Попробовал добавить следующий маршрут:

        routes.MapRoute(
            "Login",
            "Login",
            new { controller = "Main", action = "LogOn" }
          );

Изменено web.config:

    <authentication mode="Forms">
        <forms  loginUrl="~/Login" timeout="2880"/>
    </authentication>

Результат - тот же белый экран, который я получил изначально. Кажется, что страница не обрабатывается вообще. Просмотр исходного кода со сгенерированной страницы не показывает абсолютно ничего ... нет разметки ... нет объявления html .... просто ничего.

РЕДАКТИРОВАТЬ 3

Похоже, я не могу настроить правильную маршрутизацию, настроенную с помощью аутентификации форм по умолчанию через web.config. Чтобы обойти это, я создал свой собственный класс атрибутов Authorize. На данный момент меня волнует только то, что пользователь вошел в систему. Для этого я перенес действия LogOn и LogOff в контроллер учетных записей. Я переназначил корневой путь, чтобы указать на этот контроллер. В моем пользовательском атрибуте Authorize я проверяю, вошел ли пользователь в систему, и перенаправляю его обратно на страницу входа, если это не так. Вот код:

        routes.MapRoute(
          "Root",
          "",
          new { controller = "Account", action = "LogOn", id = "" }
        );

А вот код для класса RequireLoginAttribute, который я получил.

     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
        public class RequireLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
        {
            #region IAuthorizationFilter Members

            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                if (!filterContext.HttpContext.Request.IsAuthenticated) 
                {   
                    //This didn't work...it would try routing to urls like
                    //http://localhost:1524/Main.aspx/Account.aspx/Logon
                    //new RedirectResult("Account.aspx/Logon");

                    //This seems sloppy to me somehow, but it works.
                    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "LogOn" }));
                }

            }

            #endregion
        }

Теперь я могу просто применить атрибут [RequireLogin] к главному контроллеру, и он гарантирует, что пользователь должен пройти аутентификацию.

Для любопытства и полноты этого сценария я использую следующий код в действии LogOn (репозиторий еще не готов, поэтому все жестко задано):

        public ActionResult LogOn(LogOnModel login, String returnUrl)
        {
            if (ModelState.IsValid)
            {
                FormsAuthentication.SetAuthCookie(login.UserName, false);
                return Redirect(returnUrl ?? Url.Action("NextPage", "Main"));
            }
            else
            {
                return View(login);
            }
        }

returnUrl - возврат к аутентификации Windows Forms. Поскольку я не могу заставить это работать здесь, параметр всегда будет нулевым.

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

Ответы [ 2 ]

0 голосов
/ 27 июля 2010

Сведения, которые я разместил в РЕДАКТИРОВАТЬ 3 , суммируют решение этой проблемы. Я ценю весь ваш вклад в этот вопрос, но я решил его. Мне бы хотелось, чтобы работала аутентификация «из коробки», но это решение достаточно хорошо. Если мы перейдем на IIS 7, я думаю, что все равно это станет спорным.

Еще раз спасибо за вашу помощь, ребята.

0 голосов
/ 26 июля 2010

Если вам нужен .aspx для корневого каталога по умолчанию, то почему он не нужен для маршрута входа в систему?

Тогда вы могли бы сделать пару вещей

  1. На самом деле создайте страницу ASP.NET с именем Login.aspx и поместите ее в корень папки (аутентификация будет работать и для ваших страниц MVC)
  2. Измените ваш логин, чтобы сказать

    rout.MapRoute ("Login", "Login.aspx", new {controller = "Main", action = "LogOn"});

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

    http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Помните, что порядок написания ваших маршрутов в Global имеет значение. Он перестает проверять, когда находит тот, который работает, поэтому ваш улов должен быть последним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...