17

我有一个ASP.NET网站。

我希望未登录的用户自动(重新)定向到登录页面,例如,

~/Account/Login.aspx

与现在一样,用户default.aspx无需登录即可访问页面(例如 )。


注意:我的操作是基于(可能不正确)假设 ASP.NET 有自己的身份验证周期,该周期在每个(和任何)页面加载之前发生在我背后。


更新@asawyer 提供了一个链接,虽然没有帮助回答问题,但确实提供了一个漂亮的图形:

在此处输入图像描述

嗯,你试过什么?

我有一个web.config启用表单身份验证的文件:

<?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, not Windows(而不是Passport和 not None)身份验证。

奖金阅读

4

4 回答 4

28

我找到了答案。

问题:如何自动将未登录的用户重定向到登录页面?
答:拒绝匿名用户访问


更长的解释

为了自动将未登录的用户重定向到登录页面,您需要拒绝匿名访问“所有”页面。这是在网站的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>

意味着任何匿名用户都将被自动重定向到登录页面。


一个似乎从未被问过的问题得到了回答,每个人都活着。

于 2012-06-08T21:11:32.617 回答
3

如果您希望强制所有用于第一次登录的页面,您可以捕获身份验证请求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's 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;
        }
    }
}

在每个页面上调用此代码并检查您网站上的所有页面。

于 2012-06-08T21:01:19.113 回答
1

我知道那是多年以后的事了,但是如果有人发现自己在这里,您可能会在 webconfig 中丢失这一点。在标签中,您需要添加以下内容:

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

这告诉网站 SecurePage.aspx 要求用户登录。这就是我几年来一直这样做的方式

于 2019-06-05T13:09:12.070 回答
0

将此添加到您的 web.config

<system.web>
    // ...
    <authentication mode="Forms">
        <forms loginUrl="~/Account/Login.aspx" 
               name=".ASPXFORMSAUTH" 
               slidingExpiration="true" />
    </authentication>
</system.web>
于 2012-06-08T20:29:31.780 回答