【问题标题】:How to stop direct access to Form B unless Form A is completed in ASP.NET MVC?除非在 ASP.NET MVC 中完成 Form A,否则如何停止对 Form B 的直接访问?
【发布时间】:2017-06-07 12:35:22
【问题描述】:

此问题适用于 ASP.NET 网络表单MVC 应用程序。我有一个结帐流程,其中有两种形式 Form A(地址页面)和 Form B(购物车页面)。正常的快乐路径适用于客户完成Form A,然后单击提交按钮,将他带到Form B

客户可能会意外访问 Form B,而无需访问 Form A 或完成信息。如果客户直接访问Form B,我如何才能知道他是否填写了Form A?如果他没有完成Form A,我想将他重定向到Form A。是否有可以用于此目的的 ASP.NET 框架对象?

【问题讨论】:

    标签: asp.net asp.net-mvc webforms


    【解决方案1】:

    唯一万无一失的方法是将某些内容保存到数据库中,以表明特定用户已完成表格 A。这实际上可能是存储由表格 A 创建的某些实体或只是某种日志。关键是您需要与用户关联,这意味着“用户”必须实际拥有一个帐户并已登录。如果是匿名的,就没有任何真正的方法可以跟踪他们。

    通过此设置,您只需在数据库中检查用户是否有记录表明他们已在表单 B 的控制器操作中完成表单 A。如果不存在任何内容,则将用户重定向到表单 A . 否则,您允许他们查看表格 B。

    另一种方法是使用Session 或设置一个cookie 来指示表格A 已完成。两者各有利弊,都不是万无一失的。使用Session 和cookie,您可以跟踪匿名用户,因此您不必强制登录。但是,Session 不是永久数据存储。默认情况下,它会在 20 分钟没有活动后过期,即使你大大提高了超时时间,它也总是有限的。

    此外,根据您使用的会话存储,它也可能非常不稳定。 In Proc 是默认设置,因为它不需要配置。一切都存储在内存中,但如果服务器重新启动、App Pool 回收等,那么所有会话数据都会丢失。不过,可以将其配置为使用 SQL Server 之类的东西,这将非常稳定。无论哪种方式,您仍然需要处理超时问题。

    使用 cookie,您可以设置一个有效的永久过期 cookie。但是,cookie 存储在客户端,可以由用户删除。它们也可以被操纵(手动创建或修改)。这意味着,如果恶意用户知道您是如何跟踪表格 A 是否已完成的,他们基本上可以伪造这一点,并让您的网站认为他们已经完成了表格 A,而实际上他们并没有。现在,是否有人愿意这样做是完全不同的事情。不过,这是需要考虑的事情。

    最后,Session 和 cookie 都可以被用户有效地禁用。 Session 实际上使用 cookie 来存储会话 id,所以如果用户在浏览器中禁用 cookie,那么这两种方法都不起作用。

    您最好的选择仍然是强制登录并将某些内容存储在数据库中,以表明表单 A 已由该经过身份验证的用户完成。但是,如果您可以处理或减轻使用 Session 或 cookie 的缺点,那么这些可能是可行的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多