asp.net mvc 4 und visual studio 11 beta

momentan bin ich arbeitsmäßig ziemlich eingespannt, das suckt manchmal schon son bisschen, da bleibt wenig zeit für die privaten sachen, wie z.b. alkohol und xbox, kiez und freunde…

nichtdestotrotz gibts ja auch gute seiten! z.b. ist das neue visual studio in version 11 als beta erschienen und damit dann auch gleich mal die mvc4 beta. darauf applikationen aufsetzen macht mir, umso mehr ich mich damit beschäftige, immer mehr spaß!

heute habe ich eine möglichkeit gesucht, eizelne controller aktionen mit einem “CheckPrivilege” attribut zu versehen. da ich eine recht simple lösung mit eigener validierung benötigte, entschied ich mich für einen selbst gebauten custom filter.

die implementation ist denkbar einfach (danke an stackoverflow an dieser stelle, welches ich übrigens auch komplett liebe!):

public interface IPrivilegeCheckProvider
{
  bool CheckPrivilege(string privilege);
}

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class CheckPrivilegeAttribute : FilterAttribute, IAuthorizationFilter
{
  public string Privilege { get; set; }

  public CheckPrivilegeAttribute()
  {
  }

  public CheckPrivilegeAttribute(string privilegeKey)
  {
    Privilege = privilegeKey;
  }

  public CheckPrivilegeAttribute(object enumValue)
  {
    if (enumValue is Enum)
    {
      Privilege = SecurityHelper.GetPrivilegeKey((Enum)enumValue);
    }
    else
    {
      Privilege = enumValue.ToString();
    }
  }

  public void OnAuthorization(AuthorizationContext filterContext)
  {
    if (filterContext == null) throw new ArgumentNullException("filterContext");
    if (filterContext.Controller == null) throw new ArgumentException("no controller found");

    var checker = filterContext.Controller as IPrivilegeCheckProvider;

    if (checker == null)
      throw new ArgumentException(filterContext.Controller.GetType().Name + " does not implement " + typeof(IPrivilegeCheckProvider).Name);

    bool granted = checker.CheckPrivilege(Privilege);
    if (!granted)
    {
      filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Privilege '" + Privilege + "' needed to access this page.");
    }
  }
}

Damit ist man dann in der lage den aktionen im controller dieses attribut zu verpassen und im basiscontroller die “CheckPrivilege” methode zu implementieren. wenn diese “false” zurück gibt, wird vom Server eine “403 – Forbidden” response gesendet. in dem fall schlank und genau was ich brauchte 😉

bin dann mal wieder am coden (zu fischmob [was meinen aktuelle geisteszustand relativ gut beschreiben sollte…])

greetz

lars

Leave a Reply

Your email address will not be published. Required fields are marked *