2011-01-05 3 views
22

Ich habe einige geerbten Code, der SMTP-Server, Benutzername, Kennwort in der system.net/mailSettings/smtp Abschnitt der Web.config speichert.Lesen von system.net/mailSettings/smtp von Web.config in Medium Trust-Umgebung

Es verwendet sie wie so zu lesen:

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

Das war aber versagt, wenn ich auf ein Medium, das Vertrauen Umgebung bereitstellen musste.

nach der Antwort Also von this question, schrieb ich es GetSection() wie so zu verwenden:

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

Aber es ist immer noch mir auf Mittel Vertrauen eine Security geben, mit der folgenden Meldung:

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.

Also habe ich dieses requirePermission Attribut versucht, kann aber nicht herausfinden, wo ich es hinstellen soll.

Wenn ich es auf den Knoten <SMTP> anwenden, bekomme ich eine ConfigurationError: "Unbekanntes Attribut 'requirePermission'. Beachten Sie, dass Attributnamen Groß-und Kleinschreibung beachten."

Wenn ich es auf den <mailSettings> Knoten anwenden, bekomme ich immer noch die SecurityException.

Gibt es eine Möglichkeit, in diesem Config-Abschnitt programmatisch unter mittlerer Vertrauenswürdigkeit zu erhalten? Oder sollte ich einfach aufgeben und die Einstellung in <appSettings> verschieben?

+4

Immer, wenn ich hatte, dass ich Einstellung nicht brauchen, "es lesen". Wenn Sie einfach einen neuen SmtpClient() erstellen, würden Sie die Einstellungen in der Datei web.config verwenden. – turtlepick

Antwort

27

Das requirePemission-Attribut wird auf die <configSections>-Gruppierung gesetzt, die mit dem Teil der web.config übereinstimmt, mit dem das Sicherheitsproblem besteht.

zusätzlich, Sie müssen nicht tatsächlich die Einstellungen lesen Code E-Mail senden - Sie einfach eine leere SmtpClient verwenden:

new SmtpClient.Send(MyMailMessage); 

es die Einstellungen aus den Konfigurationsabschnitte standardmäßig verwendet wird senden.

+8

Heh, nur mit 'new SmtpClient()' anstatt zu versuchen, den Host und Port manuell zu extrahieren und Benutzername und Passwort funktioniert perfekt! – Carson63000

2

Joys Kodierung eh ... immer 1000 Möglichkeiten, einen Fisch häuten

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

Dies gibt nur 'null' zurück - es scheint nicht zu reflektieren, was Sie in Ihrer Web.config haben ... –

+0

Funktioniert nicht. Das schafft nur die Elemente, liest sie nicht. –

4

Dies ist für mich sehr gut funktioniert.

26

Sie können einen SmtpClient erstellen, wie einige vorgeschlagen, aber das ist ein bisschen übertrieben - lesen Sie einfach die Abschnitte direkt.

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

Um das UserName-Attribut zu erhalten: section.Network.UserName –

+0

Ich habe diesen ganzen Prozess verfolgt, aber Null-Werte alle Zeit bekommen? Was vermisse ich? – ruud

2

Um die Einstellungen von den Mail-Abschnitte erhalten nur die E-Mail-Objekte erstellen.

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> 
Verwandte Themen