【问题标题】:After logout the user should not be able to re enter into the site by typing the url of the internal pages in the address bar注销后,用户应该无法通过在地址栏中输入内部页面的 url 重新进入站点
【发布时间】:2012-01-12 23:25:57
【问题描述】:

我对 C# 和 ASP.NET 比较陌生,我在设计身份验证系统时遇到了麻烦。

我创建了一个用户必须登录的网站,之后他可以访问该网站的各个页面。当用户单击注销链接时,他返回登录页面并收到消息“您已成功注销”。现在如何防止用户绕过我的身份验证输入其中一个内部页面的 URL?在使用 PHP 时,我在每个页面的开头和结尾都使用了session_start()ob_end_flush() 来控制身份验证。 ASP.NET 中有什么类似的模型?

另外,我如何将 app_code 文件夹中的 .cs 文件包含到 aspx.cs 中?

【问题讨论】:

  • 我建议您一次只问一个问题。如果您有两个问题,请提出两个问题。

标签: c# asp.net


【解决方案1】:

如果您使用的是 FormsAuthentication,这很容易使用 web.config 中的配置来完成。

  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="default.aspx" protection="All" path="/" slidingExpiration="true" timeout="60" />
  </authentication>

此配置强制aspx确保站点中的所有页面都只能由授权用户访问。

但是,这种配置存在一个逻辑问题:没有人能够登录,因为他们必须被授权访问站点中的任何页面。

但是,您可以通过在此受保护的页面中打开“漏洞”来解决此问题,方法是添加特定页面并指示它们可以被任何人授权:

  <location path="default.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

【讨论】:

    【解决方案2】:

    现在我如何通过在地址栏中输入内部页面的 url 来防止重新进入网站。

    您实际上是如何跟踪身份验证的? Forms authentication? Windows authentication?有什么习俗吗?本质上,您需要做的是让这些页面检查有效的身份验证令牌。如果不存在这样的令牌,请重定向到登录页面或错误或类似的东西。

    您可以通过在Page_Init 方法中手动检查身份验证来做到这一点(该方法可以访问您存储此类令牌的会话数据、Cookie 数据等),您可以通过use various methods built-in 等方法。

    概念与 PHP 中的相同,只是工具略有不同。

    在使用 PHP 时,我在每个页面的开头和结尾都使用了 session_start() 和 ob_end_flush() .....我应该在 c# 中使用什么?

    您不需要在 ASP.NET 中显式地开始/结束会话状态。 Web 应用程序范围内的任何代码都可以通过System.Web.HttpContext.Current.Session 访问会话状态/值。来自同一会话的任何请求都将关联此数据。

    另外我如何将 app_code 文件夹中的 .cs 文件包含到 aspx.cs 中

    虽然在 PHP 中您必须包含文件,但在 ASP.NET 中它是编译后的代码,因此文件并不那么重要。您需要参考的是名称空间/类来使用代码。比如……

    如果您在App_Code 的文件中有以下内容:

    namespace MyApplicationCode
    {
        public class SomeCode
        {
            // stuff in the class
        }
    }
    

    然后从应用程序中的任何代码中,您应该能够通过它的完全限定名称 (MyApplicationCode.SomeCode) 使用它:

    var someVariable = new MyApplicationCode.SomeCode();
    

    另外,可以在代码文件的头部添加using语句:

    using MyApplicationCode;
    

    然后直接访问:

    var someVariable = new SomeCode(); 
    

    【讨论】:

      【解决方案3】:

      当用户通过其凭据成功通过身份验证时,cookie 会设置一个会话 ID,该会话 ID 对应于在服务器上存储值的文件。此 cookie 向服务器确认用户已通过身份验证。

      检查您的系统如何处理会话,也可以在没有会话 cookie 的情况下完成:

      (伪代码)

      if (User.Login(formUsername, formPassword)) {
          SetCookie ("LoggedIn", 1, Time() + 3600);
      }
      

      现在,哪个页面需要登录用户才能查看,您只需检查用户是否设置了 cookie:

      (伪代码)

      if (CookieIsSet("LoggedIn")) {
          // this page can be viewed
      }
      else {
          Redirect ("/notAuthorized");
      }
      

      当您注销用户时,您可以通过将过期日期设置为过去来删除cookie:

      (伪代码)

      SetCookie ("LoggedIn", 1, Time() - 3600);
      

      现在,用户无法查看内部页面,因为检查 (CookieIsSet(...)) 将失败。现在,函数、方法和所有细节都依赖于系统,但它总是这样工作:

      1. 如果凭据正常,请设置 cookie
      2. 每当访问内部页面时,检查是否设置了 cookie
      3. 注销时删除cookie

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        要检查用户是否在地址栏中键入,我只需检查受保护页面的页面加载中的 UrlReferer,其他方面应由网络安全和状态管理控制

         if (Request.UrlReferrer == null)
                Response.Redirect("errorpage.aspx");
        

        【讨论】:

        • 不错的主意,但有时浏览器或插件会尝试停止跟踪并将 UrlReferrer 设置为 null,即使不是。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        • 2015-03-16
        相关资源
        最近更新 更多