Использование маршрутизации без MVC:форма аутентификации
-
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
и обеспечить перенаправление после входа в систему.
Решение
Эти шаги должны позволить вам реализовать требуемое поведение.
Обобщить:
- Вы используете маршрутизацию, но не MVC.В моем примере будет отображаться URL-адрес типа http://хост/Мой сайт/идентификатор пользователя/12345 на реальную страницу по адресу http://host/Mysite/Pages/users.aspx?userid=12345.
- Вы хотите контролировать доступ к этим адресам, требуя от пользователя входа в систему.В моем примере есть страница 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, вам придется написать и протестировать код.
ХТХ, Инди