2011-01-05 17 views
22

Posiadam pewien odziedziczony kod, który przechowuje serwer SMTP, nazwę użytkownika, hasło w sekcji system.net/mailSettings/smtp pliku Web.config.Czytanie system.net/mailSettings/smtp z Web.config w środowisku średniego zaufania

Kiedyś czytać je tak:

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

Ale to było w przypadku braku kiedy musiałem wdrożyć w środowisku średnim zaufania.

Więc po odpowiedź od this question, przepisałem go używać GetSection() tak:

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

ale nadal daje mi SecurityException na średnim zaufania, z następującym komunikatem:

Request for ConfigurationPermission failed while attempting to access configuration section 'system.net/mailSettings/smtp'. To allow all callers to access the data for this section, set section attribute 'requirePermission' equal 'false' in the configuration file where this section is declared.

Tak więc spróbowałem tego atrybutu requirePermission, ale nie wiem, gdzie go umieścić.

Jeśli zastosuję go do węzła <smtp>, pojawia się błąd ConfigurationError: "Nierozpoznany atrybut" requirePermission ". Zauważ, że w nazwach atrybutów rozróżniana jest wielkość liter."

Jeśli zastosuję ją do węzła 01SmailSettings >, nadal otrzymuję wyjątek SecurityException.

Czy istnieje sposób, aby uzyskać w tej sekcji konfiguracji programowo w ramach średniego zaufania? Czy powinienem po prostu się poddać i przenieść ustawienie do <appSettings>?

+4

Ilekroć miałem, że ustawienie nie muszę się "czytać". Po prostu tworzenie nowego SmtpClient() będzie korzystało z ustawień na web.config. – turtlepick

Odpowiedz

27

Atrybut requirePemission jest przypisywany do grupy <configSections> pasującej do części dotyczącej pliku web.config, na którym występuje problem z zabezpieczeniami.

dodatkowo nie trzeba właściwie odczytać ustawienia z wykorzystaniem kodu do wysyłania poczty - wystarczy użyć pustego smtpclient:

new SmtpClient.Send(MyMailMessage); 

wyśle ​​za pomocą ustawień z sekcji config domyślnie.

+8

Heh, po prostu używając 'new SmtpClient()' zamiast próbować ręcznie wyodrębnić hosta, port i nazwę użytkownika i hasło działają doskonale! – Carson63000

2

Radości kodowania eh ... Zawsze 1000 sposobów na skórę rybę

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 
+3

To po prostu zwraca 'null' - nie wydaje się odzwierciedlać tego, co masz w swoim Web.config ... –

+0

Nie działa. To właśnie tworzy elementy, nie czyta ich. –

4

Działa to bardzo dobrze dla mnie.

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; 
26

Możesz utworzyć SmtpClient, jak sugerują niektórzy, ale to jest trochę przesada - po prostu przeczytaj sekcje bezpośrednio.

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

Aby uzyskać atrybut userName: section.Network.UserName –

+0

Podążyłem za tym całym procesem, ale uzyskując wartości null przez cały czas? czego mi brakuje? – ruud

2

Aby uzyskać ustawienia z sekcji pocztowych wystarczy utworzyć obiektów pocztowych.

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>