Wir betreiben in unserer Firma mehrere Webserver für das Intranet: Einen für die normale Anwendung und den Zugriff auf HTML-Seiten, einen für eigene Intranet-Applikationen und einen DB-Server. Nun möchte ich, dass sich ein Mitarbeiter einmal auf dem, nennen wir ihn HTML-Server, anmeldet, auch Zugriff auf die anderen Syteme erhält (etwa wenn er per Link eine Applikation startet). Geht sowas und wenn ja, wie?
Hallo, Ich habe soetwas neulich erst implementiert, allerdings mit SL. Ich gehe davon aus, dass der Webserver in einer Domaene mit dem DB-Server steht. Dann musst du im IIS statt NTLM den Kerberos Provider aktivieren.
Im Code der Website setzt Du impersonation auf true und beim Zugriff auf die Datenbank delegierst du die Authentifizierung. Natürlich muss in der AD Delegation vom Webserver zum DB-Server aktiviert werden.
Wenn ich im Büro bin, gebe ich dir ein paar Codeschnipsel.
//edit unsere Infrastruktur sah in etwa so aus: Webserver (SL) --impersonation--> Webserver (WCF) --delegation--> DB-Server (MS-SQL) Wenn man nicht auf SL setzt, kann man das ImpersonationLevel des ServiceProxy setzen:
Auf dem Server, auf dem du impersonifizierst und delegierst machst du folgendes:
[OperationBehavior(Impersonation = ImpersonationOption.Required)] public List<Stuff> GetStuffBy(int Id) { var result = new List<Stuff>();
if ((ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation) || (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation)) { using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) { result = DataAccessFacade.GetStuffBy(Id); } }
return result; }
Der Zugriff auf die DB im DAL geschieht schon im Kontext des aufrufenden Benutzers. Die Delegation muss in der ActiveDirectory Computers & Users für den entsprechenden aufrufenden Server eingestellt werden. (Computers & Users - Server - Properties - Delegation). Service Type wäre mssqlsvc, Port wahrscheinlich 1433. Rest in Abhängigkeit von euren Servereinstellungen.
Ja das geht :-) Eine Möglichkeit hat mplogas skizziert, eine andere wäre, die Windows Identity Foundation zu benutzen. Ich habe keine fertige Anleitung dazu parat, aber das Prinzip wäre, dass alle beteiligten Anwendungen ihre Zugangskontrolle an ein eigenes System delegieren, statt jeweils selbst den Benutzer zu authentifizieren. Dieses System kann auch mit WIF der AD-Server sein, muss es aber nicht. WIF hilft Dir dabei, die (delegierte) Authentifizierung in Deine Systeme einzubauen und nutzt dabei Standards wie SAML. Das erleichtert es, später auch noch weitere Anwendungen, auch zugekaufte Produkte (so sie sich auf den Standard stützen), mit einzubinden.
Der Verweis auf den DB-Server in Deiner Frage ist mir nicht völlig klar. Zur Sicherheit: "Normale" Benutzer sollten nicht direkt mit dem DB-Server interagieren. Das sollte den Anwendungen vorbehalten bleiben, weshalb auch diese dafür zuständig sind, die Benutzer vorher zu authentifizieren und ggf. zu autorisieren.
Wenn Ihr eine ADS Domäne habt ist das - vielleicht - gar kein Problem. Viele Systeme unterstützen die Windows Authentifizierung, so auch Asp.Net Seiten und der MS SQL Server. Einfach in der web.config folgenden Eintrag hinterlegen:
<authentication mode="Windows" />
Mit folgender Zeile erreichst Du dann, dass nur authentifizierte Benutzer mit der Seite arbeiten können.
Die Windowsanmeldung ist beim SQL Server Standard, da musst Du nur noch die notwenidigen Rechte vergeben.
Wenn an den Maschinen eine eigenständige Anmeldung nötig sein soll bekommt man das mit Asp.Net auch recht einfach hin. Schau Dir dazu mal den Membership Provider bzw. das Framework an. Da ist an solche Dinge ebenfalls gedacht worden. Du musst nur in den web.config Dateien den gleichen MaschineKey hinterlegen.
Das funktioniert dann aber nur auf Asp.Net basis und lässt sich nicht an andere Systeme deligieren. Zu dem Thema gibt es auch ein ganz neues Framework von Microsoft -> Windows Identity Foundation, das auf Claims Bases Authentication basiert. Das Thema ist aber sehr komplex und hier nicht eben in zwei Sätzen erklärt. Das ist aber dazu gedacht verschiedenste Systeme unter einen Hut zu bekommen.