Asp.net проблемы с регистрацией личности электронной почтой
Я пытаюсь установить ASP.Net идентификация в веб-форме. Когда пользователь заполняет страницу регистрации, электронное письмо отправляется, но оно пусто. Вот мой Create User_Click. Я что-то пропустил?
Protected Sub CreateUser_Click(sender As Object, e As EventArgs) Dim userName As String = Email.Text Dim manager = Context.GetOwinContext().GetUserManager(Of ApplicationUserManager)() Dim signInManager = Context.GetOwinContext().Get(Of ApplicationSignInManager)() Dim user = New ApplicationUser() With {.UserName = userName, .Email = userName} Dim result As IdentityResult = manager.Create(user, Password.Text) If result.Succeeded Then ' For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771 Dim code As String = manager.GenerateEmailConfirmationToken(user.Id) Dim callbackUrl As String = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request) manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href="">here</a>.") If user.EmailConfirmed Then signInManager.SignIn(user, isPersistent:=True, rememberBrowser:=False) IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response) Else ErrorMessage.Text = "An email has been sent to your account. Please view the email and confirm your account to complete the registration process." End If Else ErrorMessage.Text = result.Errors.FirstOrDefault() End If End Sub
Public Class EmailService Implements IIdentityMessageService Public Function SendAsync(message As IdentityMessage) As Task Implements IIdentityMessageService.SendAsync ' Plug in your email service here to send an email. Dim mm As New MailMessage() mm.From = New MailAddress("emailaddress", "name") mm.To.Add(New System.Net.Mail.MailAddress(message.Destination)) mm.Subject = "Account Created for COSI Data Reporting" mm.Body = "" mm.IsBodyHtml = True Dim smtp As New SmtpClient() smtp.Host = "##.##.###.##" smtp.Port = "###" smtp.Credentials = New System.Net.NetworkCredential("username", "password") ' mm.To.Add(New System.Net.Mail.MailAddress() smtp.Send(mm) Return Task.FromResult(0) End Function End Class
Что я уже пробовал:
Я исследовал, но не нашел ничего конкретного по этому поводу.
Richard Deeming
Вы, по-видимому, создали IIdentityMessageService
реализация для отправки электронной почты и установки UserManager
'с EmailService
к экземпляру этого класса?
Как выглядит код в этом классе?
rlgentry
Да, я установил службу IIDentityMessageService. Ниже приведен код. Я использую SMTP. Я больше ничего не изменил на странице Identityconfig.vb
Публичный Класс EmailService
Реализует IIdentityMessageService
Публичная функция SendAsync(message As IdentityMessage) в качестве задачи реализует IIdentityMessageService.SendAsync
- Подключи сюда свою почтовую службу, чтобы отправить письмо.
Тусклый мм как новое почтовое сообщение()
мм.From = New MailAddress("адрес электронной почты", "имя")
мм.To.Add(Новая Система.Net.Mail.Почтовый адрес(сообщение.Место назначения))
мм. Тема = "счет создан для сведения коси отчетности"
мм.Тело = ""
мм.IsBodyHtml = True
Dim smtp как новый SmtpClient()
протокол SMTP.Хозяин = "##.##.###.##"
протокол SMTP.Порт = "###"
smtp.Credentials = New System.Net.NetworkCredential("имя пользователя", "пароль")
' мм.To.Add(Новая Система.Net.Mail.Почтовый адрес()
smtp.Send(мм)
Return Task.FromResult(0)
Конечная Функция
End Класса
Richard Deeming
Проглотил ли сайт часть вашего кода, или это делает ваш сайт? EmailService
класс действительно установить тело сообщения в пустую строку?
rlgentry
Я не совсем понимаю, что вы имеете в виду. Когда я отлаживаю с помощью точки останова, установленной в функции Sendasyc в файле IdentityConfig, тело заполняется и все попадает.
Когда я устанавливаю точку останова в регистре, callbackUrl-это какой-то код. это верно?
Richard Deeming
Код, который вы опубликовали, имеет:
mm.Body = ""
Если он установлен правильно при отладке, то сайт, должно быть, проглотил часть вашего кода.
То
callbackUrl
должна быть ссылка обратно на ваш сайт с добавленным кодом подтверждения, который позволит сайту узнать, что адрес электронной почты, предоставленный пользователем, действителен.
rlgentry
Должно ли в мм теле что-то быть? Если да то будет ли это так
manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href="">here</a>.
и нужно ли мне удалить это из метода createuser_click?
Richard Deeming
Попробуй:
mm.Subject = message.Subject mm.Body = message.Body
Это должно использовать любой предмет и тело, которые вы передаете в
SendEmail
метод.
rlgentry
Это сработало! Спасибо.
Когда я вхожу в систему он отправляет меня на готовую страницу для ASP.net. Мне нужно изменить ReturnUrl в Page_Load Login.vb, но я не могу найти, где это установлено. Не могли бы вы направить меня?
Richard Deeming
Глядя на код, который вы опубликовали, вы, похоже, не поместили URL обратного вызова в тело сообщения:
Dim callbackUrl As String = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request) manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href="""">here</a>.")
Вы можете использовать интерполяция строк[^] чтобы вставить его:
manager.SendEmail(user.Id, "Confirm your account", $"Please confirm your account by clicking <a href=""{callbackUrl}"">here</a>.")
rlgentry
Я получил подтверждение по электронной почте, чтобы работать правильно. Теперь мои проблемы-это перенаправление входа в систему. в этом коде
Защищенный суб-логин(отправитель как объект, e Как EventArgs)
Если IsValid То
- Проверьте пароль пользователя
Dim manager = контекст.GetOwinContext().GetUserManager(Of ApplicationUserManager)()
Dim signinManager = контекст.GetOwinContext().GetUserManager(Of ApplicationSignInManager)()
- Это не считая сбоев входа в систему и блокировки учетной записи
'Чтобы включить блокировку при сбое пароля, измените значение на shouldLockout := True
Dim result = signinManager.PasswordSignIn(Электронная Почта.Текст, Пароль.Текст, Запомни.Проверено, shouldLockout := False)
Выберите результат обращения
Дело SignInStatus.Успех
IdentityHelper.RedirectToReturnUrl(Запрос.QueryString("ReturnUrl"), Ответ)
Выход Выберите
Дело SignInStatus.Локаут
Ответ.Перенаправление("/Account/Lockout")
Выход Выберите
Дело SignInStatus.RequiresVerification
Ответ.Перенаправление(Строка.Формат("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}",
Запрос.QueryString("ReturnUrl"),
Запомни это.Проверен),
Правда)
Выход Выберите
Дело Другое
FailureText.Text = "неверная попытка входа в систему"
Сообщение об ошибке.Видимое = Истинное
Выход Выберите
Конец Выбрать
Конец, Если
Конец Подводной Лодки
Где я могу изменить ReturnUrl в
Дело SignInStatus.Успех
IdentityHelper.RedirectToReturnUrl(Запрос.QueryString("ReturnUrl"), Ответ)
Выход Выберите
Richard Deeming
Он извлекает возвращаемый URL-адрес из параметра строки запроса. Это должно быть автоматически установлено, когда вы пытаетесь получить доступ к странице, которая требует аутентификации - вы будете перенаправлены на что-то, что выглядит как /Account/Login?ReturnUrl=%2fManage%2fIndex
.
Насколько я могу судить, IdentityHelper.RedirectToReturnUrl
это пользовательский метод, который вы написали. Если вы хотите изменить перенаправление по умолчанию, вам нужно будет отредактировать этот метод.
Если вы всегда хотите перенаправить на определенную страницу, независимо от того, к какой странице пользователь пытался получить доступ при перенаправлении, то замените ее Request.QueryString("ReturnUrl")
с URL-адресом, на который вы хотите перенаправить.