Как я могу автоматически переадресовать 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 требует, чтобы пользователь вошел в систему. Это то, как я делал это в течение нескольких лет