asp.net - Leyendo system.net/mailSettings/smtp desde Web.config en un entorno de confianza mediana
asp.net-3.5 (5)
Alegrías de codificar eh ... siempre 1000 formas 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
Tengo un código heredado que almacena el servidor SMTP, el nombre de usuario y la contraseña en la sección system.net/mailSettings/smtp
de Web.config.
Solía 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 estaba fallando cuando tuve que desplegar en un entorno de confianza media.
Así que siguiendo la respuesta de esta pregunta , lo reescribí para usar GetSection()
así:
SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
return settings.Network.Host;
Pero todavía me está dando una SecurityException en confianza media, con el siguiente mensaje:
La solicitud para el permiso de configuración falló al intentar acceder a la sección de configuración ''system.net/mailSettings/smtp''. Para permitir que todas las personas que llaman accedan a los datos de esta sección, establezca el atributo de la sección ''requirePermission'' igual ''falso'' en el archivo de configuración donde se declara esta sección.
Así que probé el atributo requirePermission
, pero no requirePermission
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 entre mayúsculas y minúsculas".
Si lo aplico al nodo <mailSettings>, todavía obtengo la excepción SecurityException.
¿Hay alguna manera 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>?
El atributo requirePemission va a la agrupación <configSections>
que coincide con la parte de web.config con la que tiene el problema de seguridad.
Además, no tiene que leer las configuraciones usando el código para enviar correo, simplemente puede usar un SmtpClient en blanco:
new SmtpClient.Send(MyMailMessage);
se enviará usando la configuración de las secciones de configuración por defecto.
Esto me funciona muy bien.
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;
Para obtener la configuración de las secciones de correo, simplemente cree 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>
Puede crear un SmtpClient como se sugiere, pero eso es un poco excesivo, solo lea las secciones directamente.
var section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as SmtpSection;
var host=section.Network.Host