mvc编码/解码查询字符串

时间:2017-12-18 12:17:13

标签: c# asp.net asp.net-core-mvc

我正在开发一个asp.net mvc 6应用程序,作为应用程序的一部分,我们将发送电子邮件,其中包含用户可以单击的链接,将其发送到特定的操作方法。 电子邮件链接的一个例子是

  

http://identity.platform:7000/account/register?emailinvitation=true&email=yerg@test.com

然后将转到AccountController Register操作方法:

Register(string userName, bool emailInvitation=false, string email="" )

我想要的是对网址进行Base-64编码,因此用户不会尝试手动更改任何参数,因此我们有一个像

这样的链接
  

http://identity.platform:7000/account/register?url=ZW1haWxpbnZpdGF0aW9uPXRydWUmZW1haWw9eWVyZ0B0ZXN0LmNvbQ==

因此我的mvc应用程序中的流程将是

  1. 收到请求
  2. 检查是否存在需要解码的url参数
  3. 如果是这样解码并发送到适当的控制器/操作方法
  4. 我的问题是,我应该在何处拦截请求并对其进行解码?这应该发生在路由中,还是以后的某个地方?然后,我如何使用适当的参数重定向到操作方法

1 个答案:

答案 0 :(得分:2)

在服务器上,为特定的邀请生成GUID,并在电子邮件中发送该GUID而不是参数。

您还需要重载Register操作方法,该方法接受GUID字符串。

Register(string guid) {
}

它将从数据存储中获取链接的详细信息(例如电子邮件地址),然后按照正常流程继续。

与base64不同,任何人都无法撤消它并发现参数,用户很难猜出另一个有效的GUID。您无需担心编码和解码它们,您可以轻松地制作一次性令牌,这可能对您的业务流程有所帮助。另一个好处是,您不会收到服务器日志中的电子邮件地址或用户浏览历史记录等敏感数据,也不会通过HTTP传输(根据您的示例网址)。