Аутентификация пользователей для интрасети с использованием smtp

У меня есть коллекция из примерно 400 пользователей, которые используют электронную почту здесь, в нашей компании, и мы запускаем для них интрасеть, я использую.Net Framework (C#) для прикладного уровня. Мы хотели бы аутентифицировать этих пользователей, используя те же учетные данные, которые они имеют для своей электронной почты, у нашего провайдера электронной почты такой услуги нет, поэтому у меня была идея аутентифицировать их, используя SMTP-сервер (который требует аутентификации).

Я искал Authenticate() метод класса SmtpClient, но безрезультатно, нет способа только аутентификации. Кто-нибудь должен был решить такую ​​проблему раньше? Я думаю, мне придется открыть сокет для SMTP-сервера и отправить команды самостоятельно, но, возможно, есть более простой способ сделать это.

2 ответа

Решение

Поскольку у вас есть SMTP-сервер, я предполагаю, что у вас также есть POP3-сервер. Я думаю, что я тоже в безопасности, предполагая, что учетные данные для POP3 и SMTP одинаковы.

Если мои предположения верны (что весьма вероятно), вы можете аутентифицировать их по протоколу POP3 вместо SMTP.

Таким образом, вы можете использовать класс Pop3Client, который предоставляет более одного метода аутентификации:

Таким образом, ваш код будет:

  1. соединять
  2. Аутентификация (проверка исключений)
  3. Отключить

И все готово!

Используя SmtpClient против вашего SMTP-сервера, вы запрашиваете службу. Ваше приложение должно только указывать, использовать ли аутентификацию Windows (которая будет Kerberos или NTLM в зависимости от того, как настроена ваша интрасеть) или спецификацию учетных данных, а также использовать ли SSL.

Что касается аутентификации приложения, вы можете ссылаться на WindowsIdentity из http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.getcurrent.aspx. Более конкретно, вы можете использовать свойство IsAuthenticated.

Прежде чем пытаться выполнить любой вызов на SMTP-сервер, если вы хотите использовать аутентификацию Windows, попробуйте что-то вроде этого:

SmtpClient client = new SmtpClient(server, port);
client.Credentials = CredentialCache.DefaultNetworkCredentials;

Затем позвольте SMTP-серверу авторизовать, может ли пользователь действительно выполнить предпринятое действие.

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

Другие вопросы по тегам