2010-12-13 12 views
3

Ich habe einen Webserver, wo Leute Dateien hochladen. Was ich tun muss, ist diese Dateien zu nehmen und sie in eine Dateifreigabe in der Active Directory-Domäne zu schreiben. Das Problem - der Webserver ist nicht auf der Domain.Wie kann ich in C# auf eine Dateifreigabe in einer Domäne von außerhalb einer Domäne zugreifen?

Also, wie ist der beste Weg, dies zu tun? Ich hätte gedacht, dass dies einfach wäre, etwas in der Art, eine Verbindung mit einigen Anmeldeinformationen herzustellen und es zu tun. Aber anscheinend nicht. Das nächste, was ich gefunden habe, ist Identitätswechsel mit WindowsIdentity.Impersonate, aber alles, was ich gelesen habe, sagt, das ist eine schlechte Idee in einer Produktionsumgebung.

Irgendwelche Ideen? Ich arbeite an einer Lösung, FTP die Dateien, aber das ist auch unbefriedigend, und ein Fallback-Plan.

Ich benutze C# und. NET 4.0 in (offensichtlich) eine Windows-Umgebung.

Bearbeiten: Ich sollte darauf hinweisen, dass ich keine Server (oder Dienste) ausführen kann, die auf die Außenseite auf dieser Domäne zugreifen. Das FTPing ist eine temporäre Problemumgehung.

+1

Das einzige Problem mit Impersonate ist, wenn Sie die Benutzeranmeldedaten außerhalb des Kontexts, wo sie verwendet werden sollen, leakage lassen, was * leicht * passieren kann, wenn eine Ausnahme während der Identitätsübernahme ausgelöst wird. Verwenden Sie einen Subprozess, um den Identitätswechsel durchzuführen, da die Prozessgrenze eine sichere Wand bietet, die verhindert, dass Anmeldeinformationen durchgelassen werden. –

+0

@Ben Voigt Das ist ein interessanter Punkt. Wenn ich am Ende die Impersonate machen muss (und ich kann, das FTP ist eine temporäre Maßnahme), werde ich das auf jeden Fall tun. – Patches

Antwort

0

Ich denke, dass eine FTP-Lösung besser ist als eine Windows-Freigabe; Ich würde jedoch denken, dass ein Web-Service eines bestimmten Typs die beste Option für einen Datenaustausch zwischen Domänen wäre. Das heißt, wenn Sie es mit WindowsIdentity.Impersonate arbeiten - warum nicht verwenden? In welchem ​​Kontext hast du gelesen, dass es eine schlechte Idee war?

+0

Ich habe es nicht mit Impersonate arbeiten, das ist nur eine Option, die ich im Internet gefunden habe. Das Problem damit ist die Möglichkeit, die Anmeldeinformationen zu verlieren; Außerdem glaube ich, dass es Probleme geben kann, da das gesamte Programm dann als die Identität getarnt wird, die es darstellt. Was ich möchte, ist einfach auf die Aktie zugreifen, und nichts mehr. – Patches

+0

@Patches: Ich bin ziemlich sicher, dass Identitätswechsel per-Thread ist ... aber Sie können immer noch in großen Schwierigkeiten laufen, wenn dieser Thread ein Thread-Pool-Worker-Thread ist, da Sie wenig Kontrolle darüber haben, wie lange es leben oder welchen Code es möglicherweise in der Zukunft ausgeführt wird, oder auch, ob dieser Code Teil Ihrer AppDomain ist. In einem Thread, den du kontrollierst, ist das Problem weniger, aber ich sage immer noch, der beste ist ein ganz eigener Hilfsprozess. –

1

Ich hätte ein anderes Programm wahrscheinlich einen Windows-Dienst wählen Sie die Dateien aus dem Speicherort der Web-Service-Datei und verschieben Sie sie in das Active Directory-Verzeichnis. Ich würde diesen Prozess wahrscheinlich von dem Ort ausführen lassen, an den sie kopiert werden. Stellen Sie sie in einer Freigabe auf dem Webserver zur Verfügung, die nur für die Benutzer und Administratoren des Prozesses sichtbar ist.

+0

Ich würde etwas weniger unkompliziert bevorzugen. Und das hat auch keinen anderen beweglichen Teil, wie einen Windows-Dienst. – Patches

+0

Ich mag diese Option, weil dadurch verhindert wird, dass Probleme beim Zugriff auf die Freigabe die Web-App beeinflussen. Wenn der Dienst ein Problem beim Verschieben der Datei hat (vorübergehende Netzwerkprobleme, Dateiserver heruntergefahren, was auch immer), kann er es später erneut versuchen. – josh3736

+0

Ok, im Interesse, meine Optionen offen zu halten, lassen Sie uns das für eine Sekunde verfolgen. Gibt es einen solchen Service schon, oder sprichst du davon, ein Programm zu machen und es als Windows-Service zu betreiben? – Patches

0

Gibt es eine Möglichkeit, dass Sie diese Dateifreigabe als Netzwerktreiber zuordnen können. Wenn Sie dies tun können, müssen Sie die Sicherheit nicht manuell verwalten und können sehr einfach auf diese Dateien zugreifen, als wären sie lokal.

+0

Ok. Nicht zu einer Gesamtzahl n00b, aber wie mache ich das in meinem C# -Klasse, oder aus meinem asp.net-Projekt? – Patches

+0

Wow, das ist schlimmer als 'WindowsIdentity.Impersonate'. Zugeordnete Laufwerke sind für jedes Programm zugänglich, das unter dem Web-Service-Benutzer läuft, während' WindowsIdentity.Impersonate' zumindest auf einen einzigen Thread beschränkt ist. –

+0

ja, kann das dann nicht Ich kann sicherlich nicht in die weniger sichere Richtung von "Impersonate" gehen. – Patches

Verwandte Themen