2011-01-05 13 views
22

Tengo un código heredado que almacena el servidor SMTP, nombre de usuario, contraseña en la sección system.net/mailSettings/smtp de Web.config.Leyendo system.net/mailSettings/smtp desde Web.config en entorno de confianza medio

Se usa para leerlos, así:

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

Pero esto no era cuando tenía que implementar en un entorno de confianza medio.

Así que después de la respuesta de this question, me volvió a escribir a utilizar GetSection() así:

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

Pero todavía me está dando una SecurityException en la confianza media, con el siguiente mensaje:

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.

Así que probé este atributo requirePermission, pero no puedo encontrar dónde ponerlo.

Si lo aplico al nodo <smtp>, obtengo un ConfigurationError: "Atributo no reconocido 'requirePermission'. Tenga en cuenta que los nombres de los atributos distinguen mayúsculas y minúsculas."

Si lo aplico al nodo <mailSettings>, sigo recibiendo la SecurityException.

¿Hay alguna forma de llegar a esta sección de configuración programáticamente bajo confianza media? ¿O debería simplemente renunciar a él y mover la configuración a <appSettings>?

+4

cada vez que tenía que establecer que no tenía necesidad de "leerlo". Simplemente creando un nuevo SmtpClient() usaría la configuración en el web.config. – turtlepick

Respuesta

27

El atributo requirePemission va en la agrupación <configSections> que coincide con la parte para la web.config con la que está teniendo el problema de seguridad.

, además, que no tiene que leer realmente la configuración utilizando el código para enviar el correo - sólo tiene que utilizar un SmtpClient blanco:

new SmtpClient.Send(MyMailMessage); 

se enviará utilizando la configuración de las secciones de configuración por defecto.

+8

Heh, simplemente usando 'new SmtpClient()' en lugar de tratar de extraer manualmente el host y el puerto y el nombre de usuario y la contraseña funcionan perfectamente. – Carson63000

2

alegrías de codificación eh ... siempre 1000 maneras de pelar un pez

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

Esto simplemente devuelve 'null' - no parece reflejar lo que tiene en su Web.config ... –

+0

No funciona. Eso solo crea los elementos, no los lee. –

4

Esto funciona muy bien para mí.

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

Puede crear un SmtpClient como algunos sugirieron, pero eso es un poco exagerado: simplemente lea las secciones directamente.

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

Para obtener el atributo userName: section.Network.UserName –

+0

He seguido todo este proceso, pero ¿obtengo valores nulos todo el tiempo? ¿Qué me estoy perdiendo? – ruud

2

para obtener la configuración de las secciones de correo acaba de crear los objetos de correo.

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> 
Cuestiones relacionadas