我正在生成通过电子邮件发送给应用程序用户的链接,以便让他们验证并激活他们的帐户。我以这种格式<email>|<guid>
生成一个令牌,对令牌进行加密,对其进行URL编码,然后将其放入电子邮件中。
string verificationLink = activateUserFormUrl + "?" + QueryParamNameForToken + "=" +
HttpUtility.UrlEncode(Encryptor.Encrypt(username + "|" + token));
然后将此令牌放入HTML电子邮件中(HTML有效但仅包括相关部分)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
...
<p><a href="###verificationLink###">Activate my account</a>.</p>
这对我和我网站的大多数用户都很好。但是,对于大约1%的用户在他们的电子邮件中收到链接时,它不再被编码。所以当他们点击链接时,他们会得到
https:/mysite/activate-account?actTkn=+thfPdJvWZggZmoHKznEiRV+i03uMv
而不是
https:/mysite/activate-account?actTkn=%2bthfPdJvWZggZmoHKznEiRV%2bi03uMv
因此,不会为这些用户正确检索令牌。我还没有能够重现这个问题,而且我已经测试了很多变量来试图找到问题的根源。
理论1
我的第一个想法是,某些生成的令牌无法使用HttpUtility.UrlEncode
方法正确进行URL编码。为了测试这个,我转发了一个来自用户的乱糟糟的电子邮件并检索了无效的链接。我对URL进行了编码并解密它以获取内容。然后我逐步完成了加密相同用户名和令牌,URL编码并通过电子邮件发送给自己的过程。但是,当我收到电子邮件时,它是正确的URL编码,并且工作正常。
所以它看起来并不像URL编码本身有问题。
理论2
我认为它必须是特定的电子邮件提供商。但是,其中一个用户在收到无效链接时使用的是Gmail帐户。我使用Gmail,Outlook,YOPMail和hotmail进行了测试,在每种情况下,我的电子邮件仍然可以通过URL编码正确。
我不认为它是特定于电子邮件提供商的,但我想知道是否可能有某些设置会影响在帐户基础上解释HTML的方式(?)
理论3
如果不这样做,我会假设某种类型的浏览器特定问题。我在所有版本的IE 8及更高版本,Chrome,Firefox和Safari中打开了我的Gmail,但没有一个能够复制这个问题。
其他可能性
我现在的主要理论是,有一些防病毒程序或可能的浏览器添加会影响链接。
我错过了什么吗?我已经阅读了Stackoverflow并发现了一些类似的问题,但没有一个问题有任何答案。我对决议的任何建议完全开放。如果我能得到一些帮助甚至重新创建问题,我可以测试一些解决方案。