ASP.NET MVC4-Sicherheit, Authentifizierung und Autorisierung
Arbeite ich an einem neuen asp.net mvc4-Projekt mithilfe von Visual Studio 2011 beta und werde versuchen, meinen Kopf um das ganze, was der Sicherheit. Es ist eine interne Intranet-Anwendung, wird zunächst die Verwendung von single sign-on, so wird der Benutzer (noch) nicht aufgefordert werden, eine Windows-ID/Passwort. Das Unternehmen hat eine benutzerdefinierte Anwendung für die Speicherung von Rollen für verschiedene Anwendungen und wird über eine gespeicherte Prozedur aufrufen. Es wird eine Benutzer-Anmelde-ID und zurück eine Art Sammlung mit Rollen z.B. "MyApp.Daten", "MyApp.Benutzer, "MyApp.Admin". Was ist das also genannt - ist das eine custom Membership provider, benutzerdefinierte Rollen-provider oder etwas anderes?
Ich gelesen habe, auf alle die ins und outs der Autorisierung, Authentifizierung, Mitgliedschaft, Rollen, etc. und ich kann nicht sehen den Wald vor lauter Bäumen im moment. Ich habe gelesen, dass der bestehende ASP.NET Security-Objekte wurden erprobt und getestet, und es sei denn, es sind sehr komplexe Anforderungen der in-gebaut sind, werden ausreichen, so bin ich gerne nutzen, was bereits vorhanden ist.
So, wenn ein Benutzer bereits angemeldet, um die Netzwerk-das bedeutet, dass Sie authentifiziert sind - richtig? Wenn ja, dann brauche ich nur zur Implementierung der Autorisierung. Ist es notwendig, zum dekorieren jeder der Controller oder die Action mit " aktivieren Attribut? Wenn ja, wie funktioniert die "ABC-Teil" [Autorisieren(Roles = "ABC")] gesetzt, wenn ich wieder Rollen aus meine benutzerdefinierte Funktion, die Speicher-app?
Ich Las mehrere Artikel und blog-posts mit dieser von Jon Galloway, aber ich habe verloren gegen Ende:
Anpassen von Authentifizierung und Autorisierung Der Richtige Weg
So viele Fragen...wenn jemand weiß, eine gute high-level-Beschreibung, wie dies alles hängt zusammen, dann bin ich ganz Ohr 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, in Ermangelung einer Antwort, die eine high-level-Sicht, wie dies alles hängt zusammen, ich dachte, ich würde kritzeln meine Erkenntnisse bisher:
Das Unternehmen nutzt Active Directory zum speichern der Benutzer-logon-details, so wie dieses verwendet wird, für die Mitgliedschaft brauche ich nicht eines benutzerdefinierten mitgliedschaftsanbieters. Sobald ein Benutzer angemeldet ist, wird das Unternehmen Netzwerk-dann werden Sie authentifiziert. Hinzufügen einer globalen Autorisieren filter sorgt dafür, dass jeder Benutzer Zugriff auf das system authentifiziert werden müssen. Up-to-date info von Rick Anderson auf der msdn-Website:
http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx
So, in der Globalen.asax ich möchte hinzufügen:
Sobald ein Benutzer authentifiziert ist, die ich dann aufpassen müssen Genehmigung. Die Unternehmen haben eine vorhandene Globale Daten speichern, die für Rollen, die ich nicht update-Zugriff, nur-lese-Zugriff, damit ich abrufen kann, die Rollen, die für einen bestimmten Benutzer über eine gespeicherte Prozedur aufrufen. Es kann von ein paar Tagen bis zu ein paar Wochen für den helpdesk zu Rollen erstellen, nach der ein Antrag gestellt wird, so dass aus diesem Grund für 2 standard-Rollen werden zunächst erstellt, Benutzer und Admin, und die nachfolgenden Rollen gespeichert wird in unserer Datenbank-Anwendung.
Zusammen mit diesen 2 Standardrollen die nachfolgenden Rollen erforderlich sind, wie z.B. Superuser, etc. Diese Rollen haben verschiedene Rechte, je nach business-Regeln, usw. und die müssen gespeichert werden in unserer Anwendung und Datenbank. Also, für dieses Szenario werde ich brauchen, um erstellen Sie eine benutzerdefinierte Rolle, die Anbieter, fügen Sie die entsprechenden asp.net Rolle-Tabellen, um meine app-Datenbank, und stecken Sie es in die web -.config. Hier ist eine ms-Seite mit dem Titel Verwalten der Authentifizierung Mittels Rollen, die ich bin-picking-bits aus:
http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx
Von dem, was ich bisher gelesen habe nur die Tabellen, die ich für eine benutzerdefinierte Rolle, die Anbieter sind Rollen und UsersInRoles.
CREATE TABLE-Rollen
(
Funktionsname Text (255) not NULL,
ApplicationName Text (255) not NULL,
EINSCHRÄNKUNG PKRoles PRIMARY KEY (Funktionsname, ApplicationName)
)
CREATE TABLE UsersInRoles
(
Benutzername Text (255) not NULL,
Funktionsname Text (255) not NULL,
ApplicationName Text (255) not NULL,
EINSCHRÄNKUNG PKUsersInRoles PRIMARY KEY (Username, Rolename, ApplicationName)
)
Einmal alles eingerichtet ist, muss ich herausfinden, wie das Zusammenführen der 2 standard-Rollen (User und Admin), die von der globalen datenspeicher mit der benutzerdefinierten Rollen gespeichert in meine app-Datenbank, und wenn ich (z.B.) [Autorisieren(Roles="Admin, Superuser")] auf ein Controller - /Action-oder wenn ich brauchen, um eine Unterklasse AuthoriseAttribute und tun Sie etwas cleverer.
Ich habe erkannt, dass ich als AD für die Authentifizierung brauche ich eine Möglichkeit, das hinzufügen /Injektion der Sammlung von Rollen, die der aktuelle Benutzer Mitglied ist. So, obwohl ich brauche keine benutzerdefinierten Mitgliedschaftsanbieter Funktionalität ich habe immer noch die Interaktion mit httpContext.Benutzer aktualisieren Ihre Rollen Sammlung.
Wenn Ihr die Authentifizierung wird bereits von Windows behandelt (ich vermute über Active Directory), dann ist das, was du suchst, ist ein Autorisierungs-Mechanismus, der die übereinstimmung von Rollen zu Benutzern. Eine option, die Sie haben ist zum laden der Benutzer-Rollen in der aktuellen Sitzung einmal erfolgreich. Dann erstellen Sie eine benutzerdefinierte autorisieren Attribut, das überprüfen wird, ob die aktuelle Sitzung hat die notwendigen Rollen, die Sie arbeiten mit
Dann können Sie das Attribut wie in diesem
UPDATE
AuthorizeCore ist die Methode, die verwendet werden, um zu überprüfen, ob dieser Benutzer sollte Zugriff auf die jeweilige Action-Methode. Innerhalb dieser Methode können Sie prüfen, die httpContext.Benutzer.Identität.Name-Eigenschaft gegen Ihre Datenbank oder wo deine Rollen abgelegt werden. Wenn Sie mithilfe der Windows-Authentifizierung über Active Directory, HttpContext.Benutzer.Identität sollte eine Instanz von WindowsIdentity
Ihre RolePrincipal, aktualisiert gemeinsam mit Ihnen, RoleProvider, sollte alles, was nötig ist, Holen Sie die Liste der Rollen, die mit dem authentifizierten Benutzer assoziiert. Denken Sie daran, die RolePrincipal werden, enthalten Sie schon die richtige WindowsIdentity.
Brauchen Sie nicht eine benutzerdefinierte Autorisieren Attribut. Die RolePrincipal/RoleProvider holt die benötigten Rollen und die Arbeit mit dem standard-Autorisierung Attribut.
Dem, was scheint ein bisschen seltsam ist, dass Sie wollen, um die Rollen eigentümlich Ihre Anwendung, aber Sie sagen, Sie wollen auch Rollen, die im Zusammenhang mit der Windows-Benutzer von einem separaten corporate-store als auch. Wie Sie gesagt haben, Sie wollen Sie Zusammenführen. Dies scheint nicht richtig zu mir. Entweder man will zum verwalten von Rollen in der corporate-Ebene für Ihre Anwendung, oder Sie möchten, um Sie zu verwalten, auf lokaler Ebene. In der Regel würden Sie nicht beides tun.
Aber wenn das wirklich so ist, was wollen Sie tun, dann klingt es so, als wenn Ihr RoleProvider braucht einen service (z.B. WCF) rufen oder ANZEIGE aufrufen, um weitere Informationen einzuholen. Vielleicht die Namen der "Gruppen", dass der windows-Benutzer gehört, können als "Rollen". Sie würde dann der filter nur die Gruppen, die Ihre Anwendung interessiert, und kombinieren Sie mit den Rollen, die Sie in Ihrem lokalen Rollen-Datenbanken.
Einmal, dass alle Informationen erfasst wurden, werden Sie sicher, dass der roleManager angewiesen zu speichern, die Rolle von Informationen in einem cookie. Keinen Sinn mache, dass hullabaloo bei jeder Anfrage die der Benutzer macht.