2011-01-05 1 views
22

J'ai un code hérité qui stocke le serveur SMTP, le nom d'utilisateur, le mot de passe dans la section system.net/mailSettings/smtp du fichier Web.config.Lecture de system.net/mailSettings/smtp à partir de Web.config dans un environnement de confiance moyenne

Il les lisait comme ceci:

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

Mais ce périclite quand je devais déployer dans un environnement de confiance moyen.

Ainsi, suite à la réponse de this question, je réécrite à utiliser GetSection() comme ceci:

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

Mais il me donne encore un SecurityException sur la confiance moyenne, avec le message suivant:

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.

J'ai donc essayé cet attribut requirePermission, mais je ne sais pas où le mettre.

Si je l'applique au noeud <smtp>, j'obtiens une erreur ConfigurationError: "Attribut non reconnu 'requirePermission'" Notez que les noms d'attribut sont sensibles à la casse. "

Si je l'applique au nœud <mailSettings>, je reçois toujours le SecurityException.

Y a-t-il un moyen d'accéder à cette section de configuration par programme de confiance moyenne? Ou devrais-je simplement abandonner et déplacer le paramètre dans <appSettings>?

+4

Chaque fois que j'avais que la mise en je n'ai pas besoin de "lire". Créer simplement un nouveau SmtpClient() utiliserait les paramètres du web.config. – turtlepick

Répondre

27

L'attribut requirePemission va sur le groupement <configSections> qui correspond à la partie du fichier web.config dont vous rencontrez le problème de sécurité.

En outre, vous ne devez pas lire réellement les paramètres à l'aide du code pour envoyer du courrier - vous pouvez simplement utiliser un SmtpClient blanc:

new SmtpClient.Send(MyMailMessage); 

il envoie en utilisant les paramètres des sections de configuration par défaut.

+8

Heh, juste en utilisant 'new SmtpClient()' plutôt que d'essayer d'extraire manuellement l'hôte et le port et le nom d'utilisateur et le mot de passe fonctionnent parfaitement! – Carson63000

2

Joies de codage ... eh toujours 1000 façons de la peau d'un poisson

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

Cela renvoie juste 'null' - il ne semble pas refléter ce que vous avez dans votre Web.config ... –

+0

Ne fonctionne pas. Cela crée simplement les éléments, ne les lit pas. –

4

Cela fonctionne très bien pour moi.

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

Vous pouvez créer un SmtpClient comme suggéré, mais c'est un peu exagéré - il suffit de lire les sections directement.

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

Pour obtenir l'attribut userName: section.Network.UserName –

+0

J'ai suivi tout ce processus, mais obtenir des valeurs nulles tout le temps? Qu'est-ce que je rate? – ruud

2

Pour obtenir les paramètres des sections de courrier il suffit de créer les objets de courrier.

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> 
Questions connexes