2009-08-03 5 views
28

Ich muss wissen, wie man die allgemeine Sicherheit für eine C# -Anwendung implementiert. Welche Möglichkeiten habe ich in dieser Hinsicht? Ich würde es vorziehen, einen vorhandenen Rahmen zu verwenden, wenn er meine Bedürfnisse erfüllt - ich will das Rad nicht neu erfinden.Authentifizierung, Autorisierung, Benutzer- und Rollenverwaltung und allgemeine Sicherheit in .NET

Meine Anforderungen sind wie folgt:

  • die übliche Benutzername/Passwort-Authentifizierung
  • manageing der Benutzer - Berechtigungen zuweisen Benutzer
  • Verwaltung von Rollen - Benutzer zuweisen Rollen, Berechtigungen zuweisen Rollen
  • Autorisierung von Benutzern anhand ihres Benutzernamens und ihrer Rolle

Ich suche f oder ein freies/Open-Source-Framework/eine Bibliothek, die von der .NET-Community zeitgeteilt und verwendet wurde.

Meine Anwendung verwendet einen Client/Server-Ansatz, wobei der Server als Windows-Dienst ausgeführt wird und sich mit einer SQL Server-Datenbank verbindet. Die Kommunikation zwischen Client und Server erfolgt über WCF.

Eine andere Sache, die wichtig ist, ist, dass ich in der Lage sein muss, bestimmte Benutzer oder Rollen Berechtigungen zum Anzeigen/Aktualisieren/Löschen einer bestimmten Entität, sei es ein Kunde, oder Produkt usw. usw. Für z. Jack kann eine bestimmte Anzahl von 3 von 10 Kunden anzeigen, aktualisiert jedoch nur die Details der Kunden Microsoft, Yahoo und Google und kann nur Yahoo löschen.

+2

wollen nur sicherstellen, dass Sie wissen: C# ist die Sprache. Es hat keine Sicherheit. .NET ist die Plattform. Dort ist die Sicherheit. –

+0

Thnx John - Ich verstehe den Unterschied. –

+0

Entweder Sie cann Asp.net Mitgliedschaft verlängern oder können Sie bereit verwenden Rahmen zu stopfen - VisualGuard - http://www.visual-guard.com/EN/-source_soforum.html –

Antwort

29

Für grobkörnige Sicherheit könnte der eingebaute Hauptcode nützlich sein. Das Benutzerobjekt (und seine Rollen) werden in .NET vom "Principal" gesteuert, aber sinnvollerweise kann die Laufzeit selbst dies erzwingen.

Die Implementierung eines Principals kann implementationsdefiniert sein, und Sie können normalerweise Ihre eigenen injizieren; for example in WCF.

die Laufzeit der Durchsetzung groben Zugriff zu sehen (dh der Funktionalität zugegriffen werden kann, aber nicht beschränkt auf, die spezifischen Daten):

static class Roles { 
    public const string Administrator = "ADMIN"; 
} 
static class Program { 
    static void Main() { 
     Thread.CurrentPrincipal = new GenericPrincipal(
      new GenericIdentity("Fred"), new string[] { Roles.Administrator }); 
     DeleteDatabase(); // fine 
     Thread.CurrentPrincipal = new GenericPrincipal(
      new GenericIdentity("Barney"), new string[] { }); 
     DeleteDatabase(); // boom 
    } 

    [PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)] 
    public static void DeleteDatabase() 
    { 
     Console.WriteLine(
      Thread.CurrentPrincipal.Identity.Name + " has deleted the database..."); 
    } 
} 

Dies ist jedoch mit dem fein- hilft nicht genarbter Zugang (dh "Fred kann auf Kunde A zugreifen, aber nicht auf Kunde B").


Zusätzlich; Natürlich, für feinkörnige, können Sie einfach zur Laufzeit der erforderlichen Rollen überprüfen, durch IsInRole auf der Hauptprüfung:

static void EnforceRole(string role) 
{ 
    if (string.IsNullOrEmpty(role)) { return; } // assume anon OK 
    IPrincipal principal = Thread.CurrentPrincipal; 
    if (principal == null || !principal.IsInRole(role)) 
    { 
     throw new SecurityException("Access denied to role: " + role); 
    } 
} 
public static User GetUser(string id) 
{ 
    User user = Repository.GetUser(id); 
    EnforceRole(user.AccessRole); 
    return user; 
} 

Sie können auch Ihre eigenes Haupt/identity Objekte schreiben, die faul Tests/Caching von dem tun Rollen, anstatt sie all up-front zu kennen:

class CustomPrincipal : IPrincipal, IIdentity 
{ 
    private string cn; 
    public CustomPrincipal(string cn) 
    { 
     if (string.IsNullOrEmpty(cn)) throw new ArgumentNullException("cn"); 
     this.cn = cn; 
    } 
    // perhaps not ideal, but serves as an example 
    readonly Dictionary<string, bool> roleCache = 
     new Dictionary<string, bool>(); 
    public override string ToString() { return cn; } 
    bool IIdentity.IsAuthenticated { get { return true; } } 
    string IIdentity.AuthenticationType { get { return "iris scan"; } } 
    string IIdentity.Name { get { return cn; } } 
    IIdentity IPrincipal.Identity { get { return this; } } 

    bool IPrincipal.IsInRole(string role) 
    { 
     if (string.IsNullOrEmpty(role)) return true; // assume anon OK 
     lock (roleCache) 
     { 
      bool value; 
      if (!roleCache.TryGetValue(role, out value)) { 
       value = RoleHasAccess(cn, role); 
       roleCache.Add(role, value); 
      } 
      return value; 
     } 
    } 
    private static bool RoleHasAccess(string cn, string role) 
    { 
     //TODO: talk to your own security store 
    } 
} 
3

Blick in ASP.NET's Membership Providers. Ich denke nicht, dass der Out-of-Box SQLMembershipProvider in Ihrem Fall funktioniert, aber es ist einfach genug, um Ihren eigenen Provider zu rollen.

+0

ich mein eigenes für eine interne app gerollt, auf dem bereits eine Datenbank mit eingerichteten Benutzern. Ich kann es definitiv empfehlen. –

2

würde ich einen Blick auf so etwas wie CSLA.net nehmen: Expert C# 2008 Business Objects

Es alles, was Sie benötigen bieten sollte.

+0

Diese Option sieht vielversprechend aus. Ich forsche weiter. Haben Sie weitere Informationen/Beispiele/Tutorials? –

+0

Over bei Rocky Lhotka Website die neuesten Versionen von CSLA haben alle Proben sowie Test-Projekte ... http://www.lhotka.net/cslanet/Download.aspx –

3

meine Antwort ist wahrscheinlich abhängig von der Antwort auf diese Frage: ist dies eine Enterprise-Anwendung, die mit Active Directory in ein Netzwerk lebt?

Wenn die Antwort ja ist, dann sind die Schritte, die ich würde:

1) Erstellen Sie globale Gruppen für Ihre Anwendung, in meinem Fall, ich hatte eine APPUSER Gruppe und eine AppAdmin Gruppe.

2) Sie können auf Ihren SQL Server im MIXED AUTHENTICATION-Modus zugreifen und dann Ihre APPUSER-Gruppe (n) als SQL SERVER LOGIN Ihrer Datenbank mit den entsprechenden CRUD-Rechten für Ihre DBs zuweisen Stellen Sie sicher, dass Sie auf den SQL SERVER mit Vertrauenswürdige Verbindung = True in Ihrer Verbindungszeichenfolge zugreifen.

An diesem Punkt ist Ihr AD Store für die Authentifizierung verantwortlich. Da Sie über eine TRUSTED CONNECTION auf die Anwendung zugreifen, wird die Identität des Kontos, von dem die Anwendung ausgeführt wird, an den SQL Server übergeben.

Jetzt für die Autorisierung (d. H. Ihre Anwendung zu sagen, was der angemeldete Benutzer tun darf), ist es eine einfache Frage der AD für eine Liste von Gruppen, denen der angemeldete Benutzer Mitglied ist. Suchen Sie dann nach den entsprechenden Gruppennamen und bauen Sie Ihre Benutzeroberfläche basierend auf der Mitgliedschaft auf diese Weise auf.

Die Art und Weise meine Anwendungen Arbeit sind also:

  1. die Anwendung starten, werden Anmeldeinformationen auf der Basis der angemeldeten Benutzer, dies ist der Hauptaspekt der Authentifizierung (dh sie daher anmelden können, in dem sie existieren)
  2. ich alle Gruppen für die Windows-Identität in Frage
  3. ich überprüfen, für die Standard-Benutzer-Gruppe - wenn diese Gruppe für die Windows-Identität in Frage existiert nicht, dann ist das ein Authentifizierungs-FAIL
  4. ich überprüfen, für ADMIN Benutzer Gruppe - Mit diesem ex henden in Gruppen des Benutzers, modifizieren ich den Zugriff auf die Benutzeroberfläche Komponenten Verwaltung
  5. Anzeige der UI

ich dann entweder eine Hauptaufgabe der bestimmten Rechte/etc auf es zu ermöglichen, oder ich globale Variablen verwenden, die Ich kann während der Erstellung meiner Formulare auf die entsprechende Benutzeroberfläche zugreifen (z. B. Wenn mein Benutzer kein Mitglied der ADMIN-Gruppe ist, würde ich alle DELETE-Schaltflächen ausblenden.

Warum schlage ich das vor?

Es ist eine Frage der Bereitstellung.

Ich habe die Erfahrung gemacht, dass die meisten Unternehmensanwendungen von Netzwerkingenieuren und nicht von Programmierern bereitgestellt werden. Daher ist eine Authentifizierung/Autorisierung in der Verantwortung von AD sinnvoll /Genehmigung.

Während der Erstellung neuer Benutzer für das Netzwerk erinnert sich ein Netzwerkingenieur (oder wer auch immer für die Erstellung neuer Netzwerkbenutzer verantwortlich ist) daran, Gruppenzuweisungen durchzuführen, während sie IN AD sind um in ein Dutzend Anwendungen zu gehen, um Zuordnungen von Autorisierungen zu analysieren.

Dies hilft mit dem Labyrinth der Berechtigungen und Rechte, die neue Hires gewährt werden müssen oder die das Unternehmen verlassen müssen und es Authentifizierung und Autorisierung in dem zentralen Repository, wo es gehört (dh in AD @ der Domain) Controller-Ebene).

+0

Hey Stephen. Die App Ich entwickle auf ein firmeninternes Netzwerk gehostet werden - aber es ist nicht eingerichtet ist eine Windows-Domäne, so dass keine Active Directory. Alle Daten, einschließlich Benutzer- und Berechtigungsinformationen, werden in der Datenbank gespeichert. Nur der WCF-Windows-Dienst kann direkt mit der Datenbank kommunizieren, während alle Clients mit dem WCF-Dienst kommunizieren. –

0

Ich denke, dass Sie hier ein paar getrennte Probleme betrachten - es ist kein Zufall, dass die meisten Sicherheitssysteme Authentifizierung und Autorisierung trennen.

Für die Authentifizierung ist die größere Frage logistisch. Oder gibt es einen logischen Ort für diese Benutzer, sei es lokal in der Anwendung, in Active Directory, einem anderen LDAP-Speicher oder sogar in einer anderen Anwendung. Genau dort, wo es ziemlich unwichtig ist, müssen wir nur in der Lage sein, Benutzer zuverlässig zu identifizieren und diese Aufgabe vorzugsweise zu einem anderen Problem zu machen. Ende des Tages brauchen Sie wirklich nur eine eindeutige Kennung und der Komfort, dass Bob von Buchhaltung ist eigentlich Bob aus dem Rechnungswesen.

Autorisierung ist der interessantere Teil des Problems hier. Ich denke, wenn es wirklich fein säuberlich ist, wollen Sie das wirklich vollständig in Ihrer Anwendung verwalten, egal woher die Benutzer kommen. Marc Gravell hat wirklich einen guten Weg gefunden, zumindest einige davon zu modellieren - einige benutzerdefinierte Implementierungen von IPrincipal und PrincipalPermission zu verwenden, um Dinge zu managen, ist eine sehr saubere Methode, um loszulegen. Darüber hinaus können Sie Techniken wie this one verwenden, um komplexere Autorisierungsentscheidungen auf ziemlich saubere Weise zu treffen.

0

Ich würde den Begriff "RBAC" (Role-based Access Control System) als Lösung für alle Ihre Anforderungen verwenden.

Ich würde nicht sehr detailliert gehen, um 'RBAC' hier zu erklären, eher würde ich es kurz nachschreiben.

Es enthält im Wesentlichen 3 Funktionen.

1) Authentifizierung - Es bestätigt die Identität des Benutzers. Normalerweise geschieht dies über Benutzerkonten und Passwörter oder Anmeldeinformationen.

2) Autorisierung - Sie definiert, was Benutzer in einer Anwendung tun können und was nicht. Ex. 'Bestellung ändern' ist erlaubt, aber 'neue Bestellung erstellen' ist nicht erlaubt.

3) Überwachung von Benutzeraktionen in Anwendungen. - Er verfolgt die Aktionen des Benutzers in Anwendungen und wer hat welchen Zugriff welchen Benutzern gewährt?

können Sie hier RBAC auf Wiki überprüfen.

https://en.wikipedia.org/wiki/Role-based_access_control

jetzt in Bezug auf Antwort auf Ihre Anforderungen - eine der möglichen Lösung ist Asp.Net Mitgliedschaft nach Bedarf zu erweitern.

Und In Bezug auf einige bereit Framework zu verwenden, würde ich VisualGuard empfehlen, für die ich arbeite, können Sie dies überprüfen sollten, es tut all die Dinge, was Sie ganz einfach brauchen, und was am wichtigsten ist, ist, Sie verwaltet alle Benutzer Für Rollen, Berechtigungen und Anwendungen über die Central Administration Console und für die Definition von Berechtigungen benötigen Administratoren kein Entwicklerwissen, dh sie können über die Benutzeroberfläche Einschränkungen für Aktivitäten erstellen.

Sie können auch diesen Artikel überprüfen, um mehr Verständnis für Berechtigung und rollenbasiertes System zu haben.

http://www.visual-guard.com/EN/net-powerbuilder-application-security-authentication-permission-access-control-rbac-articles/dotnet-security-article-ressources/role-based-access-control-source_soforum.html