我正在使用一个Web应用程序,它是MVC 5 Angular JS混合. Web应用程序中没有身份验证,匿名用户可以来询问某些服务的价格.为了获得价格,用户需要回答几页中的一些问题.这是app的流程.
>用户点击按钮获取价格
>生成请求的唯一URI,用户将重定向到问题页面
>用户回答问题,用户提交答案.问题分布在通过角度路由导航的多个页面上.答案将在页面导航中保存回服务器.
>一旦用户提交答案,系统(服务器)就会生成价格并将其显示给用户.
目前,如果用户已经为URI添加了书签,他可以在几天之后返回,并从他离开的地方继续.我想阻止这种行为.
我在MVC中有哪些不同的选择?我可以想到以下几点:
>使用带有过期时间的HttpCookie
>在DB中保存上次访问时间并验证用户是否在规定的时间范围内?
我想避免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]是什么),否则它被客户端修改.
现在,您可以将任何非机密数据存储在用户链接中,允许用户共享此链接以及您可以使用链接执行的其他重要操作,而无需担心有人修改我们的链接.如果广泛知道的序列化算法如JSON,客户端也可以反序列化第一部分.
我认为这个流程将带来更好的用户体验,以防突然关闭浏览器(将在您的情况下清理cookie)并与他人共享链接(如果您需要)
希望这会有所帮助.