c# - 使用 HttpCookie 超时/url 过期

标签 c# asp.net angularjs asp.net-mvc session-cookies

我正在开发一个 Web 应用程序,它是 MVC 5 + Angular JS 的混合体。 Web 应用程序中没有身份验证,匿名用户可以来询问某些服务的价格。要获得价格,用户需要回答分布在几页上的一些问题。这是应用程序的流程。

  1. 用户点击按钮获取价格

  2. 生成请求并将用户重定向到问题页面的唯一 URI

  3. 用户回答问题并提交答案。这些问题分布在通过 Angular 路由导航的多个页面上。答案会在页面导航时保存回服务器。

  4. 用户提交答案后,系统(服务器)生成价格并将其显示给用户。

目前,如果用户已将 URI 加入书签,他可以在几天后返回并从他离开的地方继续。我想阻止这种行为。

我在 MVC 中有哪些不同的选项?我可以想到以下内容:

  1. 使用带有过期时间的HttpCookie

  2. 在数据库中保存上次访问时间并验证用户是否在规定的时间范围内?

我想避免 HttpSession。我倾向于使用 HttpCookie,因为它看起来是最简单的选择。

  1. 如果我们使用 HttpCookie 选项,我需要记住任何副作用吗?

  2. 我可以寻找 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/

相关文章:

javascript - Angularjs 在指令中获取数据

c# - 将 Autofac 容器传递给 WPF UserControl

c# - 如何使用C#向文件中插入字符

c# - 无法使用 Cosmos 3.3 sdk 使用 CreateItemAsync 写入我的容器

c# - 使用 Windows.Security.Cryptography.RSACryptoServiceProvider;在 Windows Phone 8.1 或通用应用程序中

c# - 从 ASP.NET 中的 Seek Position 流式传输 MP4 视频

c# - 带有 .Years 和 .Months 的实时时间跨度对象

asp.net - Telerik ASP.NET RadEditor 和 Azure Blob 存储?

javascript - 从输入类型密码到范围获取尾随空格?

javascript - Angular JS/文章未定义