Использование маршрутизации без MVC: форма аутентификации - PullRequest
3 голосов
/ 01 января 2009

Сейчас я пытаюсь работать с System.Web.Routing. Все просто отлично, но я не могу понять, как заставить аутентификацию формы работать с маршрутизацией URL (возврат URL, перенаправление и т. Д.). Гугл ничего не говорит. Помогите! :)

UPD: Я забыл - я не использую MVC . Это проблема. Как использовать rounig и аутентификацию формы без MVC

UPD2: подробнее о моей проблеме
Что я хочу получить: URL-адреса типа «mysite.com/content/123», «mysite.com/login/» и т. Д. С использованием маршрутов. Важно, чтобы страница входа работала как «обычная» форма входа ASP.NET (перенаправляет на вход из защищенной области, когда вход не выполнен, и перенаправляет обратно в защищенную область при входе в систему).
Это то, что я делаю.
В global.asax на Application_Start зарегистрируйте маршруты следующим образом:

routes.Add("LoginPageRoute", new Route("login/", new CustomRouteHandler("~/login.aspx")));
routes.Add("ContentRoute", new Route("content/{id}", new ContentRoute("~/content.aspx"))
{
    Constraints = new RouteValueDictionary {{ "id", @"\d+" }}
});

Где CustomRouteHandler и ContentRoute - простые IRouteHandler классы, например: ...

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
    return page;
}

...

Все кажется идеальным: я получаю content.aspx, когда перехожу к “/content/10” и login.aspx, когда перехожу к “/login/”. Но ...
Когда я защищаю контент (в web.config, с deny=”?”), форма входа не работает должным образом.
Теперь я не могу перейти на страницу “/content/10”:

0. Я набираю “/content/10” в своем браузере.
1. Сайт перенаправляется на “/login/?ReturnUrl=%2fcontent%2f10”. (Хм ... кажется, что все проблемы начинаются здесь, верно? :)
2. Я пытаюсь войти в систему. Независимо от того, какие учетные данные я ввел ...
3. … сайт перенаправляет меня на “login?ReturnUrl=%2fContent%2f10” (желтый экран ошибки - Access is denied. Описание: An error occurred while accessing the resources required to serve this request. The server may not be configured for access to the requested URL.)
Итак, проблема заключается в том, как заставить ASP.NET понимать реальный ReturnUrl и обеспечивать перенаправление после входа в систему.

Ответы [ 2 ]

9 голосов
/ 12 января 2009

Эти шаги должны позволить вам реализовать требуемое поведение.
Подведем итог:

  1. Вы используете маршрутизацию, но не MVC. Мой пример отобразит URL типа http://host/Mysite/userid/12345 на реальную страницу в http://host/Mysite/Pages/users.aspx?userid=12345.
  2. Вы хотите контролировать доступ к этим адресам, требуя от пользователя входа в систему. В моем примере есть страница http://host/Mysite/login.aspx со стандартным элементом управления входом в систему, а сайт настроен на использование проверки подлинности с помощью форм.

Шаг 1

Я «спрятал» содержимое папки «Страницы», используя этот файл web.config в папке «Страницы»:

  <?xml version="1.0"?>
  <configuration>
    <system.web>
      <httpHandlers>
        <add path="*" verb="*"
            type="System.Web.HttpNotFoundHandler"/>
      </httpHandlers>
      <pages validateRequest="false">
      </pages>
    </system.web>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <handlers>
        <remove name="BlockViewHandler"/>
        <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler"/>
      </handlers>
    </system.webServer>
  </configuration>  

Это гарантирует, что если кто-либо использует URL-адрес, такой как http://host/Mysite/Pages/users.aspx?userid=12345,, он получит стандартный ответ 404.

Шаг 2

Мой файл web.config верхнего уровня содержит (как и все стандартные элементы) этот элемент местоположения:

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

Это предотвращает анонимный доступ к URL-адресам в форме http://host/Mysite/userid/12345, что означает, что пользователи будут автоматически перенаправлены на login.aspx, затем, если они предоставят действительные учетные данные, они будут перенаправлены в правильное местоположение.

Шаг 3

Для справки вот мой global.asax:

<script RunAt="server">

    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RegisterRoutes(RouteTable.Routes);
     }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.RouteExistingFiles = true;
        routes.Add("UseridRoute", new Route
        (
           "userid/{userid}",
           new CustomRouteHandler("~/Pages/users.aspx")
        ));
    }

</script>

А вот мой обработчик маршрута:

using System.Web.Compilation;
using System.Web.UI;
using System.Web;
using System.Web.Routing;
using System.Security;
using System.Web.Security;


public interface IRoutablePage
{
    RequestContext RequestContext { set; }
}

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        var page = BuildManager.CreateInstanceFromVirtualPath
             (VirtualPath, typeof(Page)) as IHttpHandler;

        if (page != null)
        {
            var routablePage = page as IRoutablePage;

            if (routablePage != null) routablePage.RequestContext = requestContext;
        }

        return page;
    }
}
0 голосов
/ 01 января 2009

Первый результат, который я получил при поиске в Google, - это отличный пост Фредерикса по аутентификации форм в ASP.NET MVC . Обратите внимание, что этот пост был актуален для ранней версии ASP.NET MVC, вам придется написать и протестировать код.

HTH, Indy

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