【问题标题】:User unable to verify account using Asp.Net用户无法使用 Asp.Net 验证帐户
【发布时间】:2012-02-12 03:44:19
【问题描述】:

我有一个简单的创建用户向导和自定义会员提供程序,取自 here

现在我正在关注scott Mitchell 的本教程,并使用向导创建新用户,并且能够通过将禁用创建属性用户设置为“False”来发送电子邮件,这样每当用户收到激活链接时,他都需要单击该链接并验证他的帐户。

现在的问题是,当他创建新用户时它工作正常,当他尝试立即登录时,他收到消息,他需要先激活链接才能登录。

注册后他会收到电子邮件,当他点击链接时,它给我的错误是数据库中没有用户。

正如您在下面看到的,该用户获得了激活链接

当用户试图点击它时,他会发现在数据库中找不到他

如果我签入管理工具,如果我检查用户是否可用且旁边没有勾号。

这是我的 web.config:

    <?xml version="1.0"?>

<configuration>
  <connectionStrings>
    <add name="HDIConnectionString"
     connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|HDIMembershipProvider.mdf"/>
  </connectionStrings>
  <system.web>
    <roleManager defaultProvider="CustomProvider">
      <providers>
        <add connectionStringName="HDIConnectionString" name="CustomProvider"
          type="System.Web.Security.SqlRoleProvider" />
      </providers>
    </roleManager>
    <membership defaultProvider="HDIMembershipProvider">
      <providers>
        <clear/>
        <add name="HDIMembershipProvider" type="HDI.AspNet.Membership.HDIMembershipProvider" connectionStringName="HDIConnectionString" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Clear"/>
      </providers>
    </membership>
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1"/>
    <authentication mode="Forms">
      <forms name=".ASPXFORMSAUTH" loginUrl="Login.aspx" />
    </authentication>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
  </system.web>
  <appSettings>
    <add key="adminEmail" value="noreply@xyz.com"/>
  </appSettings>
  <system.net>
    <mailSettings>
      <smtp from="xyz@gmail.com">
        <network host="smtp.gmail.com" password="password" port="587" userName="xyz@gmail.com"/>
      </smtp>
    </mailSettings>
  </system.net>
</configuration>

createuser.aspx 后面的代码:

 Protected Sub CreateUserWizard1_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles CreateUserWizard1.SendingMail
        Dim userInfo As MembershipUser = Membership.GetUser(CreateUserWizard1.UserName)

        'Construct the verification URL
        Dim verifyUrl As String = Request.Url.GetLeftPart(UriPartial.Authority) & Page.ResolveUrl("~/Verify.aspx?ID=" & userInfo.ProviderUserKey.ToString())

        'Replace <%VerifyUrl%> placeholder with verifyUrl value
        e.Message.Body = e.Message.Body.Replace("<%VerifyUrl%>", verifyUrl)
    End Sub

验证 Page_Load:

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Make sure that a valid querystring value was passed through
        If String.IsNullOrEmpty(Request.QueryString("ID")) OrElse Not Regex.IsMatch(Request.QueryString("ID"), "[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}") Then
            InformationLabel.Text = "An invalid ID value was passed in through the querystring."
        Else
            'ID exists and is kosher, see if this user is already approved
            'Get the ID sent in the querystring
            Dim userId As Guid = New Guid(Request.QueryString("ID"))

            'Get information about the user
            Dim userInfo As MembershipUser = Membership.GetUser(userId)
            If userInfo Is Nothing Then
                'Could not find user!
                InformationLabel.Text = "The user account could not be found in the membership database."
            Else
                'User is valid, approve them
                userInfo.IsApproved = True
                Membership.UpdateUser(userInfo)

                'Display a message
                InformationLabel.Text = "Your account has been verified and you can now log into the site."
            End If
        End If

这是数据库截图:

【问题讨论】:

  • verify.aspx 中的代码怎么样 - 你能把它贴出来吗?
  • @Baldy-我已经更新了。抱歉:)
  • 数据库中是否有用户使用 URL 参数中的 GUID?
  • @Kiran:Membership.GetUser(new GUID("7041053a-792f-47e0-bf2e-92febda23f09")) 是否总是返回null,我的意思是在任何情况下都来自调试器?它是否适用于其他(已批准的)GUID?
  • @Tim-它总是返回空值。

标签: asp.net email activation createuserwizard


【解决方案1】:

您将 guid 类型传递给 Membership 类的 GetUser 方法。

更新现在已经测试过了。传递 GUID 确实调用了正确的重载 - GetUser(object providerUserKey)。所以这个答案是不相关的。

您如何确定这在运行时被推断为正确的重载?

GetUser has both string and object single parameter overloads,因此将 guid 作为对象传递是有意义的,这样您就可以明确说明要调用的重载。

框架可能会在您的 guid 上调用 ToString(),这将调用查找用户名而不是提供程序键的重载。

现在不在电脑前,但应该是这样的......

      Dim key as new object()
'put the guid in the object type
    key = Userid
    Dim user = Membership.GetUser(key)

【讨论】:

  • @Baldy-那么我该如何更改,请您发布一些代码吗?
  • @Baldy:他正在调用接受对象的重载,因为他已经传递了一个 GUID。如果它是字符串或布尔值,则会调用 GetUser 的其他重载版本。
  • 已经为你添加了一个例子
  • @Baldy:除了 Kiran 的代码,你的肯定不行。您正在将一个字符串传递给 GetUser。但是,尽管有 GUID,但该重载需要一个用户名。
  • 我无法测试它,因为我不在电脑上。但是,他需要确定调用了正确的重载。已更新代码以将 guid 传递给对象。他需要尝试这样做,以将其从潜在原因列表中消除。你说'那个重载'但有 2 个单参数重载
【解决方案2】:

@Tim 和 Baldy-我终于开始工作了,但不是使用 UserID。我不知道 GUID 有什么问题,我用用户名尝试了它,它运行良好。

因此,如果对 GUID 进行任何修改,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2014-01-10
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多