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!
Und ich denke nicht, mit NHibernate wäre ein Problem. – Rafa
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
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