Пользователь не может подтвердить учетную запись, используя Asp.Net - PullRequest
2 голосов
/ 17 января 2012

У меня есть простой мастер создания пользователей и пользовательский поставщик членства, который был взят из здесь

Теперь я слежу за этим уроком Скотт Митчелл и создаю нового пользователяиспользуя мастер и возможность отправлять электронную почту, задав для параметра «Отключить создание свойства пользователя» значение «Ложь», чтобы при получении пользователем ссылки активации ему нужно было щелкнуть ее и подтвердить свою учетную запись.

Теперь проблема заключается в том, что он создает нового пользователя.он работает нормально, и когда он пытается сразу войти в систему, он получает сообщение, что ему необходимо сначала активировать ссылку для входа в систему.

И после регистрации он получает электронное письмо, и когда он щелкает ссылку, это выдает мне ошибку, чтов базе данных нет пользователя.

Как видно из приведенного ниже, пользователь получает ссылку активации enter image description here

Когда пользователь пытается щелкнуть по нему, он обнаруживает, что его нет в базе данных.enter image description here

И если я проверю в инструменте администрирования, если я проверю, пользователь доступен без галочки рядом с ним.enter image description here

Вот мой 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

А вот и скриншот базы данных: enter image description here

Ответы [ 2 ]

0 голосов
/ 17 января 2012

@ Тим и Болди, я наконец-то начал работать, но не с UserID. Я не знаю, что не так с GUID, и я попробовал его с именем пользователя, и он отлично работает.

Так что, если какие-либо изменения с GUID, пожалуйста, дайте мне знать.

0 голосов
/ 17 января 2012

Вы передаете тип guid методу GetUser класса Membership.

ОБНОВЛЕНИЕ Протестировал это сейчас. Передача GUID вызывает корректную перегрузку - GetUser(object providerUserKey). Так что этот ответ не актуален.

Как вы можете быть уверены, что это соответствует правильной перегрузке во время выполнения?

GetUser имеет как строковые, так и объектные перегрузки одного параметра , поэтому имеет смысл передать guid как объект, чтобы вы явно указали, какую перегрузку вы хотите вызвать.

Каркас может вызывать ToString () в вашем guid, что вызовет перегрузку, которая ищет имя пользователя, а не ключ провайдера.

Сейчас не за компьютером, но так должно быть ...

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