Использование маршрутизации без MVC:форма аутентификации

StackOverflow https://stackoverflow.com/questions/405394

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

УПД2: подробнее о моей проблеме
Что я хочу получить:URL-адреса такие «mysite.com/content/123”, “mysite.com/login/» и т. д. с помощью Routes.Важно, чтобы страница входа работала как «обычная» форма входа 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 и обеспечить перенаправление после входа в систему.

Это было полезно?

Решение

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

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

Шаг 1

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

  <?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://хост/Мой сайт/идентификатор пользователя/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;
    }
}

Другие советы

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

ХТХ, Инди

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top