为什么我的用户无法验证他们的电子邮件地址?

时间:2014-06-11 10:38:33

标签: asp.net sql-server email uniqueidentifier

我正在使用uniqueidentifier来验证ASP.NET应用程序中用户的电子邮件地址。当我尝试使用uniqueidentifier验证任何电子邮件地址时,我可以毫无问题地这样做。但是,80%的用户不能这样做。我无法弄清楚为什么会这样!我让用户直接给我发电子邮件,转发他们的激活电子邮件,我可以毫无问题地激活他们的帐户。

以下是电子邮件中验证链接的示例。

  

mysite.org/petition.aspx?uid=0fcc9582-386c-4738-943d-36e09c8df4bd

以下是发生的例外情况:

problem loading petition screen: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).:
    at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)
     at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)
     at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
     at System.Guid..ctor(String g)
     at MAP.Umbraco.UserControls.SignPetitionUserControl.get_PetitionGuid()
     at MAP.Umbraco.UserControls.SignPetitionUserControl.OnLoad(EventArgs e)

UPDATE:这是我的PetitionGuid属性的get方法。

private Guid? PetitionGuid
        {
            get
            {
                if (Page.Request.QueryString["uid"] == null)
                    return null;
                else
                    return new Guid( Page.Request.QueryString["uid"].ToString());
            }
        }

我有什么明显的遗失吗?

随意提出您可能需要提出的任何问题。

3 个答案:

答案 0 :(得分:2)

你错过了一个角色。

0fcc9582-386c-4738-943d-36e09c8df4b   <---
12345678 1234 1234 1234 123456789012

<强>更新

根据您的上述更新,您对请愿指南的实施不是非常具有防御性。

private Guid? PetitionGuid
    {
        get
        {
            if (Page.Request.QueryString["uid"] == null)
                return null;
            else
                return new Guid( Page.Request.QueryString["uid"].ToString());
        }
    }

所以基本上,如果uid参数是除了null之外的任何东西,(一个数字,随机字符串,其他垃圾)你将尝试将它变成一个guid。这显然会导致失败...进行一些登录,并记录正在提交的UID的值。

你可能应该使用像tryParse这样的东西,而不仅仅是尝试异常。

if(string.IsNullOrEmpty(s))
    Console.WriteLine("Null or Empty");

Guid g; 
Guid.TryParse(s, out g);

if(g == Guid.MinValue)
    Console.WriteLine("Couldn't Parse");
else 
    Console.WriteLine("G: {0}", g);

答案 1 :(得分:1)

Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 这些0fcc9582-386c-4738-943d-36e09c8df4b符合要求吗?你在最后一部分失去了一位数。你有11位而不是12位。

答案 2 :(得分:0)

基于当前的答案和评论以及您使用Umbraco的事实,我认为QueryString以编码形式提供给您。更好地确保我们得到的是理智和有效的,并以我们可以实际处理它的格式。主要的改进是usimg HttpUtility.Decode以使查询字符串成形。

private Guid? PetitionGuid
{
    get
    {
        Guid? guid = null;
        var raw = Page.Request.QueryString["uid"];
        if (!String.IsNullOrEmpty(raw))
        {
            var decoded = HttpUtility.UrlDecode(raw);
            Guid parsed;
            if (Guid.TryParse(decoded, out parsed))
            {
                guid = parsed;
            }
            else
            {
                Trace.WriteLine(String.Format(
                    "illigal uid {0}:{1}", raw,decoded)); 
            }
        }
        return guid;
    }
}