Как я могу автоматически переадресовать ASP.NET без регистрации пользователей Forms на страницу входа?
У меня есть ASP.NET.
Я хочу, чтобы пользователи, которые не вошли в систему, автоматически (повторно) перенаправлялись на страницу входа, например,
~/Account/Login.aspx
Как и сейчас, пользователи могут посещать страницы (например, default.aspx
) без входа в систему.
Примечание. Я работаю над (возможно, неверным) предположением, что ASP.NET имеет свой собственный цикл проверки подлинности, который происходит за моей спиной, прежде чем загружается каждая (и любая) страница.
Обновить @asawyer предоставил ссылку, которая, не помогая ответить на вопрос, действительно показала довольно графическую:
![Enter image description here]()
Ну, что вы пробовали?
У меня есть файл web.config
, который позволяет аутентифицировать Forms:
<?xml version="1.0"?>
...
<configuration>
...
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" name=".ASPXFORMSAUTH" slidingExpiration="true"/>
</authentication>
...
</system.web>
...
</configuration>
Когда я просматриваю страницу "по умолчанию", я могу просмотреть ее, например,
GET http://localhost:53149/WebSite/ HTTP/1.1
Host: localhost:53149
И я получаю содержимое страницы:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Другими словами, вместо того, чтобы заходить на сайт, я не вынужден регистрироваться на веб-сайте.
Это может быть связано с тем, что мой браузер работает локально на веб-сервере; но я использую Forms
, а не Windows
(а не Passport
, а не None
)).
Чтение бонусов
Ответы
Ответ 1
Я нашел ответ.
Вопрос: Как автоматически перенаправить пользователей без входа на страницу входа?
Ответ: Запретить доступ анонимных пользователей
Дольше Объяснение
Чтобы автоматически перенаправить пользователей, не зарегистрированных в систему, на страницу входа, вам необходимо запретить доступ анонимных к страницам "все". Это делается в файле web.config
сайта:
web.config
<?xml version="1.0"?>
<configuration>
<system.web>
...
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
специальный ?
токен используется для представления анонимных пользователей.
Это в сочетании с сообщением аутентификации Forms, где находится страница "Логин":
<?xml version="1.0"?>
<configuration>
<system.web>
...
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
означает, что любые анонимные пользователи будут автоматически перенаправлены на страницу входа.
Вопрос, который, кажется, никогда не спрашивался, прежде чем получить ответ, и все живут.
Ответ 2
Если вы хотите принудительно использовать для всех страниц все используемые для первого входа, вы можете захватить запрос аутентификации на global.asax
и сделать это программно следующим образом:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
// This is the page
string cTheFile = HttpContext.Current.Request.Path;
// Check if I am all ready on login page to avoid crash
if (!cTheFile.EndsWith("login.aspx"))
{
// Extract the form authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
// If not logged in
if (null == authCookie)
// Alternative way of checking:
// if (HttpContext.Current.User == null || HttpContext.Current.User.Identity == null || !HttpContext.Current.User.Identity.IsAuthenticated)
{
Response.Redirect("/login.aspx", true);
Response.End();
return;
}
}
}
Этот код вызывается на каждой странице и проверяет все страницы вашего сайта.
Ответ 3
Добавьте это к вам web.config
<system.web>
// ...
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx"
name=".ASPXFORMSAUTH"
slidingExpiration="true" />
</authentication>
</system.web>
Ответ 4
Я знаю это много лет спустя, но если кто-то окажется здесь, вы можете пропустить этот бит в веб-конфигурации. В теге вы должны добавить это:
<location path="SecurePage.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
Это говорит сайту, что SecurePage.aspx требует, чтобы пользователь вошел в систему. Это то, как я делал это в течение нескольких лет