Vixita-i50 Ответов: 1

Как решить проблему аутентификации SMTP-сервера


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

В сообщении об ошибке говорится:
Цитата:
Сообщение=SMTP-серверу требуется безопасное соединение или клиент не прошел проверку подлинности. Ответ сервера был следующим: 5.5.1 требуется аутентификация


ниже приведен мой код:

protected void eMailSubmit_Click(object sender, EventArgs e)
        {
            string username = "";
            string password = "";
            SqlConnection con = new SqlConnection(@"Data Source=My_DataBae;Integrated Security=False;");
            SqlCommand cmd = new SqlCommand("SubmitEmail", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = TextBoxSubmiteMail.Text;
            con.Open();
            SqlDataReader sdr = cmd.ExecuteReader();
            {

                if (sdr.Read())
                {
                    username = sdr["username"].ToString();
                    password = sdr["password"].ToString();

                    
                }

            }
            con.Close();

           if (username != TextBoxSubmiteMail.Text)
            {
                lblemailSubmit.Text = "The submitted eMail does not belong to this account, check the eMail and try again";
            }
            else if (!string.IsNullOrEmpty(password)) {  
            MailMessage msg = new MailMessage();  
            msg.From = new MailAddress("myMail@gmail.com");  
            msg.To.Add(TextBoxSubmiteMail.Text);  
            msg.Subject = " Recover your Password";  
            msg.Body = ("Your Username is:" + username + "<br/><br/>" + "Your Password is:" + password);  
            msg.IsBodyHtml = true;  
  
            SmtpClient smt = new SmtpClient();  
            smt.Host = "smtp.gmail.com";  
            System.Net.NetworkCredential ntwd = new NetworkCredential();  
            ntwd.UserName = "myMail@gmail.com"; //Your Email ID  
            ntwd.Password = ""; // Your Password  
            smt.UseDefaultCredentials = true;  
            smt.Credentials = ntwd;  
            smt.Port = 587;  
            smt.EnableSsl = true;  
            smt.Send(msg);  
            lblemailSubmit.Text = "Username and Password Sent Successfully";  
            lblemailSubmit.ForeColor = System.Drawing.Color.ForestGreen;  
        }  


это моя хранимая процедура:

CREATE PROCEDURE [dbo].[SubmitEmail]  (
    @Email nvarchar(20)   
	)  
AS   
BEGIN
    SET NOCOUNT ON; 
	 (
    SELECT Email, Password FROM My_Table WHERE Email= @email  
      )
END;  


Как мне устранить эту ошибку?

Я

Что я уже пробовал:

Я попытался ввести свой пароль электронной почты.

Richard Deeming

НИКОГДА храните пароли в виде обычного текста, а также НИКОГДА отправьте пароль пользователя по электронной почте.

Вы должны хранить только соленый хэш пароля пользователя, используя уникальную соль для каждой записи.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]

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

Все, что вы когда-либо хотели знать о создании безопасной функции сброса пароля[^]

Richard Deeming

Кроме того, попробуйте установить smt.UseDefaultCredentials = false; вместо true. Установка его в true сделает свое SmtpClient класс игнорирует учетные данные, предоставленные в Credentials собственность.

И, вероятно, было бы проще хранить настройки SMTP в конфигурационном файле:
system.net / mailSettings / smtp / сеть[^]

Kornfeld Eliyahu Peter

Почему бы не вставить эти два комментария в решение?

Richard Deeming

Сделано. :)

F-ES Sitecore

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

1 Ответов

Рейтинг:
1

Richard Deeming

Цитата:
smt.UseDefaultCredentials = true;

Если свойство UseDefaultCredentials[^] устанавливается в true, этот Credentials свойство игнорируется. То SmtpClient будет предпринята попытка аутентификации с использованием учетных данных по умолчанию текущего вошедшего в систему пользователя. Это будет работать только в том случае, если вы используете почтовый сервер, являющийся частью вашего рекламного домена.

Свойство должно быть установлено на false вместо.

Было бы проще хранить настройки SMTP в конфигурационном файле, а не жестко кодировать их:
system.net / mailSettings / smtp / сеть[^]
<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="Network">
                <network

                    host="smtp.gmail.com" port="587" enableSsl="true"

                    defaultCredentials="false"

                    userName="myMail@gmail.com"

                    password="Y0urP@ssw0rd!"

                />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

SmtpClient smt = new SmtpClient();
smt.Send(msg); 


ОДНАКО, как я уже упоминал в комментариях, вы должны НИКОГДА храните пароли в виде обычного текста, а также НИКОГДА отправьте пароль пользователя по электронной почте. Вы должны хранить только соленый хэш пароля пользователя, используя уникальную соль для каждой записи.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]

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

Все, что вы когда-либо хотели знать о создании безопасной функции сброса пароля[^]


Kornfeld Eliyahu Peter

Можете ли вы сделать абзац "однако" больше? Гораздо больше!!!
+5 (только для этого предложения)