Authentifizierung, Autorisierung, Benutzer- und Rollenverwaltung und allgemeine Sicherheit in .NET

StackOverflow https://stackoverflow.com/questions/1222974

Frage

Ich muß wissen, wie über die Implementierung von allgemeiner Sicherheit für eine C # .NET-Anwendung zu gehen. Welche Möglichkeiten habe ich in dieser Hinsicht haben? Ich würde es vorziehen, einen vorhandenen Rahmen zu verwenden, wenn es meine Bedürfnisse erfüllt -. Ich will nicht das Rad neu erfinden

Meine Anforderungen sind wie folgt:

  • die üblichen Benutzername / Passwort-Authentifizierung
  • Verwaltung von Benutzern - assign Berechtigungen für Benutzer
  • Verwaltung von Rollen - Benutzer zuweisen Rollen, Berechtigungen zuweisen Rollen
  • Autorisierung von Benutzern basierend auf ihren Benutzernamen und Rolle

Ich bin auf der Suche nach einer freien / Open-Source-Framework / Bibliothek, die von .NET Community zeit Tesed und verwendet wurde.

Meine Anwendung nimmt ein Client / Server-Ansatz, mit dem Server als Windows-Dienst ausgeführt wird, zu einer SQL Server-Datenbank zu verbinden. Die Kommunikation zwischen Client und Server wird durch WCF sein.

Eine andere Sache, die wichtig ist, ist, dass ich bestimmte Benutzer oder Rollen Berechtigungen Ansicht / Update zuweisen können / eine bestimmte Einheit löschen, sei es ein Kunde sein, oder Artikel usw. Für z.B. Jack kann einen bestimmten 3 von 10 Kunden sehen, sondern nur aktualisiert die Details Kunden Microsoft, Yahoo und Google und Yahoo nur löschen kann.

War es hilfreich?

Lösung

Für grobkörnige Sicherheit, können Sie den eingebauten Haupt Code nützlich finden; das Benutzerobjekt (und ihre Rollen) in .NET durch das „Kapital“ kontrolliert, aber sinnvollerweise die Laufzeit selbst kann dies erzwingen.

Die Implementierung eines Prinzipal kann die Implementierung definiert werden, und Sie können Ihren eigenen injizieren; zum Beispiel in WCF .

, um die Laufzeit der Durchsetzung groben Zugriff zu sehen (das heißt, die 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...");
    }
}

Allerdings bedeutet dies nicht mit dem feinkörnigen Zugang helfen (das heißt „Fred Kunden A zugreifen kann, aber nicht Kunden B“).


Zusätzliche; Natürlich, für feinkörnige, können Sie einfach die erforderlichen Rollen zur Laufzeit ü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 eigene Haupt / identity Objekte schreiben, die faul Tests / Caching der Rollen zu tun, anstatt sie alle up-front zu wissen:

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
    }
}

Andere Tipps

Schauen Sie in ASP.NET Membership Provider . Ich glaube nicht, das aus der Box SqlMembershipProvider wird in Ihrem Fall arbeiten, aber es ist einfach genug, um Ihren eigenen Provider zu rollen.

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

Wenn die Antwort ja ist, dann sind die Schritte, die ich zur Verfügung stellen würde:

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

2) Lassen Sie Ihren SQL Server in der Lage sein, in der gemischten Authentifizierungsmodus zugegriffen werden, und dann APPUSER Gruppe (n) als SQL Server-Anmeldung zu Ihrer Datenbank mit den entsprechenden CRUD Rechten auf Ihre DB (n) zuweisen und sicherstellen, dass Sie den SQL Server mit Vertrauenswürdige Verbindung = True in der Verbindungszeichenfolge zugreifen zu können.

An diesem Punkt AD Store wird für die Authentifizierung verantwortlich. Da sind Sie die Anwendung über eine gesicherte Verbindung zugreifen, wird es die Identität übergeben, was auch immer Konto wird die Anwendung auf den SQL Server ausgeführt wird.

Nun, für ZULASSUNG (das heißt zu sagen Ihre Anwendung, was in Benutzer den angemeldeten tun darf) es ist einfach eine Frage der für eine Liste der Gruppen AD abfragt, die der angemeldete Benutzer ist ein Mitglied. Dann sind Sie für die entsprechenden Gruppennamen und die Benutzeroberfläche auf Mitgliedschaft auf diese Weise Basis aufzubauen.

Die Art und Weise meiner Anwendungen Arbeit ist also:

  1. Start der Anwendung, werden Berechtigungsnachweise auf der Grundlage der Benutzer angemeldet-in, das ist der Hauptaspekt der Authentifizierung (das heißt, sie können also in log sie existieren)
  2. Ich erhalte alle Gruppen für die Windows-Identität in Frage
  3. I für die Standard-Benutzergruppe überprüfen - wenn diese Gruppe für die Windows-Identität nicht in Frage gibt, dann ist das ein Authentifizierungs-FAIL
  4. Ich überprüfe für Gruppen ADMIN Benutzer - Wenn diese in Gruppen des Benutzers vorhanden, ich die Benutzeroberfläche ändern Zugriff auf Administrationskomponenten zu ermöglichen
  5. Anzeige des UI

Ich habe dann entweder eine Hauptaufgabe die bestimmten Rechte / etc auf sie, oder ich verwende globale Variablen, die ich zugreifen kann die entsprechende Benutzeroberfläche, um zu bestimmen, während meine Formen bauen (dh, wenn mein Benutzer kein Mitglied der ADMIN-Gruppe ist , dann würde ich alle DELETE Tasten verbergen).

Warum ich dies vorschlagen?

Es ist eine Frage der Bereitstellung.

Es war meine Erfahrung, dass die meisten Enterprise-Anwendungen von Network Engineers eingesetzt werden, statt Programmierern - daher Authentifizierung / Autorisierung mit der Verantwortung von AD sein macht Sinn, wie das ist, wo die Netzwerk-Jungs gehen, wenn Sie Authentifizierung diskutieren / Genehmigung.

Darüber hinaus bei der Erstellung neuer Benutzer für das Netzwerk, ein Network Engineer (oder wer auch immer für die Schaffung neue Netznutzer verantwortlich ist) ist eher geneigt, daran zu erinnern, Gruppenzuordnungen durchzuführen, während sie in AD als die Tatsache, dass sie müssen gehen in ein Dutzend Anwendungen Zuweisungen der Zulassung parsen.

Des Tun hilft mit dem Labyrinth von Berechtigungen und Rechten, die neuen Mitarbeiter müssen gewährt werden oder müssen diejenigen, verlassen das Unternehmen verweigert werden, und es unterhält die Authentifizierung und Autorisierung im zentralen Repository, in dem es (dh in AD @ Domänencontroller gehört Ebene).

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

Es sollte alles, was Sie benötigen.

WCF haben reiche sicherheitsbezogene Funktionalität sowohl die Autorisierung und Authentifizierung bietet. In Details hier: http://msdn.microsoft.com/en-us/library/ms735093. aspx

Ich glaube, Sie in ein paar verschiedene Probleme suchen hier - es ist kein Zufall, die meisten Sicherheitssysteme trennen Authentifizierung und Autorisierung.

Für die Authentifizierung ist die wichtigere Frage logistisch. Oder gibt es einen logischen Ort für diese Benutzer zu leben, seien es lokal zur Anwendung, in Active Directory, einen anderen LDAP-Speicher oder auch in einer anderen Anwendung. Genau dort, wo ist ziemlich immateriell - wir müssen nur in der Lage sein, soliden Benutzer zu identifizieren und vorzugsweise diese Aufgabe jemand anderes Problem zu machen. Ende des Tages müssen Sie wirklich nur eine eindeutige Kennung und den Komfort, den Bob von Accounting tatsächlich ist Bob aus dem Rechnungswesen.

Die Zulassung ist der interessantere Teil des Problems hier. Ich denke, wenn es wirklich feinkörnig ist, können Sie diese wirklich ganz in Ihrer Anwendung verwalten möchten, unabhängig davon, wo die Benutzer kommen. Marc GRA wirklich auf einem guten Weg trifft zumindest einen Teil davon zu modellieren - verwenden eine benutzerdefinierte Implementierung von IPrincipal und Principal Dinge zu verwalten, ist eine sehr saubere Art und Weise zu beginnen. Darüber hinaus können Sie Techniken verwenden, wie diesem komplexe Genehmigungsentscheidungen in einer ziemlich sauber Weise zu machen.

Ich würde den Begriff - 'RBAC' (Role Based Access Control System) als die Lösung für alle Ihre Anforderungen

.

würde ich nicht in viel Detail gehen zu erklären ‚RBAC‘ hier, eher würde ich beschreiben sie kurz wie:

Es enthält im Wesentlichen drei Funktionen.

1) Authentifizierung - Es bestätigt die Identität des Benutzers. Normalerweise wird es über Benutzerkonten und Passwörter oder Zugangsdaten erfolgen.

2) Authorization - Es definiert, was Benutzer tun kann und in einer Anwendung nicht tun kann. Ex. ‚Ändern Ordnung‘ ist erlaubt, aber ‚die Schaffung neuer Ordnung‘ ist nicht erlaubt.

3) Prüfung von Benutzeraktionen auf Anwendungen. - Es verfolgt die Aktionen des Benutzers auf Anwendungen sowie die erteilt hat, die an die Benutzer zugreifen?

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

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

Nun, in Bezug auf Antwort auf Ihre Anforderungen - eine der möglichen Lösung ist ASP.NET-Mitgliedschaft nach Ihren Bedürfnissen zu erweitern

.

Und in Bezug auf einige bereit Framework zu nutzen, würde ich empfehlen, VisualGuard für die ich arbeiten, sollten Sie diese überprüfen, es tut all die Dinge, was Sie ganz einfach brauchen, und was am wichtigsten ist, ist, es verwaltet alle Ihre Benutzer, Rollen, Berechtigungen und Anwendungen über zentrale Administrationskonsole und zur Definition von Berechtigungen Administratoren benötigen keine Entwickler Wissen, dh er / sie Beschränkungen für Aktivitäten über die Benutzeroberfläche erstellen können.

Sie können diesen Artikel überprüfen mehr Verständnis auf Erlaubnis und rollenbasierte System haben.

http://www.visual-guard.com/EN/net-powerbuilder-application-security-authentication-permission-access-control-rbac -waren / dotnet-security-Artikel-ressources / rollenbasierte-Access-Control-source_soforum.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top