2016-04-08 6 views
0

Ich bin eigentlich eine Website mit ASP.Net MVC mit NHibernate entwickeln Ich muss Berechtigungen für Gruppen verwalten, Seite und einige andere Dinge Ich möchte meine Rollen, Berechtigungen, Betrieb, Gruppen, und all diese Dinge in meiner Datenbank.Sicherheits-Toolkit für ASP.Net MVC

Und wie eine alte post würde ich gerne wissen, ob Ayende Rhino Security Toolkit noch relevant ist, oder ob es andere relevante generische Toolkits gibt?

Antwort

0

Für meine neue Projekte, die ich das Identitätssystem

http://www.asp.net/identity

Das ASP.NET-Identity-System verwendet haben, ist entworfen, um die vorherige ASP.NET-Mitgliedschaft und einfache Mitgliedschaft Systeme zu ersetzen. Es umfasst Profilunterstützung, OAuth Integration, arbeitet mit OWIN, und ist mit den ASP.NET-Vorlagen geliefert mit Visual Studio 2013

Insbesondere dieses Tutorial hat mir sehr geholfen das erste Mal

http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-1

enthalten
+0

Und ich denke nicht, mit NHibernate wäre ein Problem. – Rafa

+0

Ich habe das ASP.Net Identity System bereits mit meiner Lösung integriert, aber ich brauche ein erweitertes Berechtigungs-Toolkit wie Ayende Rhino Security, das meine Gruppe, Erlaubnis, Operation usw. verwalten kann. – Arnaud

+0

Ok, also habe ich zu meinem letzten Projekt einige Funktionen implementiert Ich habe Rollen und AccessLevels, ich habe Rollen für Klassencontroller und Zugriffsebenen pro Controller verwendet.1 Benutzer kann 1 Rolle und mehrere Zugriffsebenen haben. Ich habe 1 Zugriffsebene namens "General", die allen zugewiesen wird und eine andere namens "MoneyGuy", die nur eine bestimmte Gruppe von Menschen – Rafa

0

Sie können auch in Betracht ziehen MembershipReboot. Es geht, soweit ich weiß, noch über die Asp.Net-Identität hinaus, obwohl es ursprünglich gemacht wurde, um die Mängel der Mitgliedschaft zu überwinden.

Über Rhino Security Toolkit, ich weiß nicht, in welchem ​​Zustand es ist. Hier

0

ist ein Beispiel dafür, was ich tat

Schritt 1 - Erstellen der Ansprüche für Benutzer

var identity = new ClaimsIdentity(
    new[] { 
      new Claim(ClaimTypes.Name, usr.Name), 
      new Claim(ClaimTypes.Email, usr.Email), 
      new Claim(ClaimTypes.Role, usr.Roles.FirstOrDefault().Role), 
      new Claim("StuffXId", usr.StuffXId + ""), 
      new Claim("StuffYId", usr.StuffYId + "") 

    } 
    , "BMMC"//"ApplicationCookie" 
); 

foreach(AccessLevels x in usr.AccessLevels) 
    identity.AddClaim(new Claim("AccessLevel", x.Access)); 

Schritt 2 - Ich habe meine Klasse BMClaimsAuthorize

public class BMClaimsAuthorize : AuthorizeAttribute 
{ 
    public string ClaimType { get; set; } 
    public string Value { get; set; } 

    public BMClaimsAuthorize() { } 

    public BMClaimsAuthorize(string ClaimType, string Value) 
    { 
     this.ClaimType = ClaimType; 
     this.Value = Value; 
    } 

    protected override bool AuthorizeCore(HttpContextBase context) 
    { 
     return context.User.Identity.IsAuthenticated 
      && context.User.Identity is ClaimsIdentity 
      && ((ClaimsIdentity)context.User.Identity).HasClaim(x => 
       x.Type == ClaimType && x.Value == Value); 

    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (filterContext.Result is HttpUnauthorizedResult) 
      filterContext.Result = new RedirectResult("~/Account/DeniedAccess"); 

    } 

} 

3 - peject mit .BMTools (importiert meine Bibliothek)

[BMClaimsAuthorize("AccessLevel", "General")] 
public ActionResult Index() 
{ 
    ViewBag.Name = CurrentUser.Name; 
    ViewBag.Email = CurrentUser.Email; 
    ViewBag.StuffX = CurrentUser.ValueOf("StuffXId"); 
    return View(); 
} 

ich meine eigene cotroller Klasse (die vom Controller erbt), die ich die Benutzer Ansprüche leicht

CurrentUser.Name 

erhalten hilft, aber das ist ein anderes Thema ..

Das ist mein eigentlichen Code, ich habe 2 Tabellen wo Benutzer einer Rolle zugeordnet sind und acceslevels

Rolle nur sagen, ob sie Admins sind oder nicht (als Tabelle statt ein Benutzerfeld gehalten, falls ich später mehrere Rollen brauche), sie sind auf der Oberseite der Controller-Klassen wo Nur Admemanden können darauf zugreifen.

AccessLevel erzählen alles andere (sie filtern nach Methode). Wenn Sie etwas Komplexeres benötigen, können Sie weitere Ansprüche hinzufügen (wie in meinem AccessLevel-Anspruch) und die Methoden BMClaimsAuthorize und AuthorizeCore entsprechend Ihren Kriterien bearbeiten.

Zum Beispiel macht es ein Array von Strings akzeptieren, so dass Sie so etwas wie dies

[BMClaimsAuthorize("AccessLevel", {"General","Admin","other"...})] 

this helps senden!

+0

Und ja, in meinem Beispiel können Benutzer viele AccessLevels haben, das heißt, sie können Teil vieler Gruppen sein – Rafa