我正在开发一个 Web 应用程序,它是 MVC 5 + Angular JS 的混合体。 Web 应用程序中没有身份验证,匿名用户可以来询问某些服务的价格。要获得价格,用户需要回答分布在几页上的一些问题。这是应用程序的流程。
用户点击按钮获取价格
生成请求并将用户重定向到问题页面的唯一 URI
用户回答问题并提交答案。这些问题分布在通过 Angular 路由导航的多个页面上。答案会在页面导航时保存回服务器。
用户提交答案后,系统(服务器)生成价格并将其显示给用户。
目前,如果用户已将 URI 加入书签,他可以在几天后返回并从他离开的地方继续。我想阻止这种行为。
我在 MVC 中有哪些不同的选项?我可以想到以下内容:
使用带有过期时间的
HttpCookie
在数据库中保存上次访问时间并验证用户是否在规定的时间范围内?
我想避免 HttpSession
。我倾向于使用 HttpCookie
,因为它看起来是最简单的选择。
如果我们使用
HttpCookie
选项,我需要记住任何副作用吗?我可以寻找 MVC 中的任何其他替代方案吗?
最佳答案
如果您想在不涉及存储的情况下使某些链接过期并且您的服务需要扩展,我认为您只需在链接中添加过期日期并签名即可。
我相信你可以用这样的方式创建你的 URL
伪代码:
var info = [Payload any info you need to store(questionnaire id or so)] + [expirationDate]
var sign = HMAC256(info + [SERVER_SECRET])
var clientLinkParameter = info + sign
var clientLink = [baseURL] + [delimiter] + Base64(clientLinkParameter)
*HMAC256 - 这只是您可以使用您想要的任何算法创建签名的示例
现在您可以通过解析分隔符之前部分中的序列化数据来检查您的链接是否过期。您还可以通过检查来检查日期是否未被修改:
HMAC256([partBeforeDelimiter] + [SERVER_SECRET]) 和 [partAfterDelimiter]
相等。如果它们匹配,这就是您的服务器发送的链接(因为只有您的服务器知道 [SERVER_SECRET] 是什么)否则它会被客户端修改。
现在您可以在用户链接中存储任何非 secret 数据,允许用户共享此链接以及您可以使用链接做的其他很棒的事情,而不必担心有人修改我们的链接。如果客户端使用像 JSON 这样广为人知的序列化算法,那么客户端也可以反序列化第一部分。
我认为这个流程会在浏览器突然关闭的情况下带来更好的用户体验(在你的情况下会清除 cookie)并且还会与某人共享链接(如果你需要的话)
希望这会有所帮助。
关于c# - 使用 HttpCookie 超时/url 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44061747/