ASP MVC 5: Abfrage von Berechtigung in Controller oder View?

  • C# (ASP)
  • MVC

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    ASP MVC 5: Abfrage von Berechtigung in Controller oder View?

    yo Leute,

    ich habe eine generelle Frage zur speziellen Aufbereitung einer View.
    Gewünscht ist, dass je nach angemeldeten User bestimmte Elemente (zb: Hyperlinks) angezeigt werden sollen.
    So soll zB.: die IT-Entwicklung Zugriff auf die Stammdaten besitzen, der eigentliche Endkunde jedoch nicht. Damit mein ich aber nicht nur, dass der Zugriff über das "AuthorizeAttribute" abgefragt wird, sondern der Punkt soll gar nicht erst angezeigt werden.

    Verbunden bin ich mit Active-Directory wo auch die Authentifizierung problemlos funktioniert.
    Da in der IPrincipal-Schnittstelle bereits eine Methode "IsInRole" existiert habe ich das Interface um eine Funktion "IsInActiveDirectoryGroup" erweitert.
    Die Abfrage der Gruppe funktioniert.

    Wo soll aber nun korrekterweise die Abfrage stattfinden? Soll bereits der Controller eine gefilterte Liste an das View übergeben, oder soll direkt im View abgefragt werden?
    Controller wäre:

    C#-Quellcode

    1. public ActionResult Menu()
    2. {
    3. if(!User.Identity.IsAuthenticated)
    4. return RedirectToAction("Login", "Account");
    5. // Transaction ist nur eine Dummyklasse mit einer Description- und Groups-Property
    6. List<Transaction> transactionsShow = new List<Transaction>();
    7. List<Transaction> transactions = new List<Transaction> {
    8. new Transaction("Stammdaten", "IT,IT-Entwicklung", null), // Zugriff nur für Gruppe IT und IT-Entwicklung
    9. new Transaction("Planung","", null), // Alle haben Zugriff
    10. new Transaction("Stammdaten2","IT", null) // Zugriff nur für Gruppe IT
    11. };
    12. foreach(Transaction trans in transactions)
    13. {
    14. if (User.IsInActiveDirectoryGroup(trans.Groups))
    15. transactionsShow.Add(trans);
    16. }
    17. return View(transactions);
    18. }


    Oder View:

    HTML-Quellcode

    1. @model List<Projektname.Models.Transaction>
    2. @{
    3. Layout = null;
    4. }
    5. <!DOCTYPE html>
    6. <html>
    7. <head>
    8. <meta name="viewport" content="width=device-width" />
    9. <title>Menu</title>
    10. </head>
    11. <body>
    12. <div>
    13. @foreach(Projektname.Models.Transaction trans in Model)
    14. {
    15. if(User.IsInActiveDirectoryGroup(trans.Groups))
    16. {
    17. <div>@trans.Description</div>
    18. }
    19. }
    20. </div>
    21. </body>
    22. </html>


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ahoi,

    richtiger wäre es, die Abfrage im Controller durchzuführen und in diesem Bsp. währe es ja auch ohne Probleme machbar. Schon alleine für die Wiederverwendbarkeit der Liste ist es auch am sinnvollsten.
    Und nach MVC-"Richtlinien", gehören solche Sachen immer in den Controller, die View ist einzig und allein für die Ausgabe zuständig ... aber ich weiß selber, dass es hin und wieder einfacher ist manche Abarbeitung der View zu überlassen ... wäre aber unsauber.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Hallo Manü,

    der Ansicht bin/war ich auch.
    Ich hatte vorher ein wenig gegoogelt und da kam ich auf einen stackoverflow Post (stackoverflow.com/questions/18…ain-roles-in-asp-net-mvc5) wo jemand das gleiche Problem hatte (nur halt mit Rollen) und da kam eben als Antwort, dass einfach im View abgefragt werden sollte.

    Dann war ich im Prinzip eh auf dem richtigen Weg :)

    Besten Dank!
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Nun prinzipiell ist in den meisten MVC-Frameworks die User-Kontrolle schon mit dabei worüber du recht einfach via der Models User und Roles, welche schon eine Relation haben sollten, recht einfach die Rollen abfragen. Auch in der View. Aber deine Lösung sieht mir eher so aus, als ob man die Roles auch für andere Views verwenden kann, damit wäre die Abarbeitung in einem Controller am sinnvolsten.
    Aber am Ende steht es dir ja offen, es auch in der View zu organisieren. Ich hatte dabei nur schon sehr unübersichtliche Sachen gesehen. Der HTML-Code war fast nicht mehr lesbar und die Abarbeitung kaum noch nachvollziehbar, ich habe auch selbst mangels Erfahrung und aus Gründen der Einfachheit, sowie extremem Zeitdruck extrem große Views gebaut, die dann wiederum kaum les- und wartbar waren.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manü“ ()

    Würde gewisse Dinge getrost in der view abfragen. Hab ich auch schon öfters gemacht. Hatte nie Probleme damit. Ob ich einen link anzeige oder nicht ist irgendwo auch ein view Thema. Über solche Dinge kann man immer philosophieren.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich hab noch nicht viel mit MVC gearbeitet. Ist hier auch das erste Projekt was wir hier machen.
    Ich finde es, in diesem Fall, im Controller auch schöner, da ich hier normalen C# Code schreiben kann und das View einfach nur anzeigt.
    Sollte sich der Fall mal ergeben, dass es im View einfach "leichter" ist bestimmte Dinge abzufragen muss man sich denk ich speziell ansehen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten