Подтвердить что ты не робот

Чтение system.net/mailSettings/smtp из Web.config в среде среднего доверия

У меня есть унаследованный код, в котором хранятся SMTP-сервер, имя пользователя и пароль в разделе system.net/mailSettings/smtp файла Web.config.

Он читал их так:

Configuration c = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
MailSettingsSectionGroup settings = (MailSettingsSectionGroup)c.GetSectionGroup("system.net/mailSettings");
return settings.Smtp.Network.Host;

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

Итак, следуя ответу этого вопроса, я переписал его, чтобы использовать GetSection() следующим образом:

SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
return settings.Network.Host;

Но он по-прежнему дает мне защиту SecurityException on Medium, со следующим сообщением:

Запрос на конфигурацию не удалось при попытке доступа раздел конфигурации 'System.net/mailSettings/smtp. к разрешить всем вызывающим абонентам получать доступ к данным для этого раздела задайте раздел атрибут 'requirePermission' равен "false" в файле конфигурации где этот раздел объявлен.

Итак, я попробовал этот атрибут requirePermission, но не могу понять, куда его поместить.

Если я применил его к <smtp> node, я получаю ConfigurationError: "Unrecognized attribute" requirePermission ". Обратите внимание, что имена атрибутов чувствительны к регистру."

Если я применил его к <mailSettings> node, я все еще получаю SecurityException.

Есть ли какой-либо способ программно настроить этот раздел конфигурации под средним доверием? Или я должен просто отказаться от него и переместить параметр в <appSettings> ?

4b9b3361

Ответ 1

Атрибут requirePemission относится к группе <configSections>, которая соответствует части fo.config, с которой вы столкнулись с проблемой безопасности.

Кроме того, вам не нужно действительно читать настройки с помощью кода для отправки почты - вы можете просто использовать пустой SmtpClient:

 new SmtpClient.Send(MyMailMessage);

он по умолчанию будет отправлять настройки из разделов конфигурации.

Ответ 2

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

var section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as SmtpSection;
var host=section.Network.Host

Ответ 3

Это очень хорошо для меня.

var smtp = new System.Net.Mail.SmtpClient();
var host = smtp.Host;
var ssl = smtp.EnableSsl;
var port = smtp.Port;

var credential = new System.Net.Configuration.SmtpSection().Network;
var username = credential.UserName;
var password = credential.Password;

Ответ 4

Радости кодирования eh... всегда 1000 способов кожи рыбы

System.Net.Configuration.SmtpSection smtp = new System.Net.Configuration.SmtpSection();
string from = smtp.From;
//etc
System.Net.Configuration.SmtpNetworkElement nt = new System.Net.Configuration.SmtpNetworkElement();
string host = nt.Host;
//etc

Ответ 5

Чтобы получить настройки из почтовых разделов, просто создайте почтовые объекты.

var client = new SmtpClient();
var messageSettings = new MailMessage();

var host=client.Host;
//etc...

var fromAddress=messageSettings.From.Address;
//etc..

Config:

  <system.net>
    <mailSettings>
      <smtp from="[email protected]" deliveryMethod="Network" >
        <network host="smtp.mail.yahoo.com" port="587" enableSsl="true"
            userName="[email protected]" password="xxxxxxx"/>
      </smtp>     
    </mailSettings>
  </system.net>