2009-12-07 11 views
7

Ich versuche herauszufinden, wie Links für Benutzer basierend auf ihren Rollen angezeigt/ausgeblendet werden. Ich weiß, wie man das authorize-Attribut für eine Aktionsmethode einstellt, aber ich habe Probleme, Links in einer Ansicht ausblenden zu lassen, wenn der Benutzer in meiner Rollendatenbank ein Administrator oder ein Manager ist.Anzeigen/Ausblenden von Links in einer ASP.Net MVC-Ansicht

Irgendwelche guten Artikel oder Codebeispiele, auf die mich jemand hinweisen kann?

Antwort

11

In Ihrer Ansicht können Sie den IPrincipal Benutzer über die System.Web.Mvc.ViewPageUser Eigenschaft referenzieren.

z. Ihrer Ansicht nach kann man so etwas hat:

<% if (User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Admin only link", "Edit", "Users") %> 
<% } %> 

<% if (User.IsInRole("Manager") || User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Manager & Admin only link", "Edit", "Product") %> 
<% } %> 

HTHS,
Charles

+0

Dank nutzen könnten! Hier ist eine Wendung - ich habe meine Tab-Links in der Masterseite und ich möchte einen Tab für bestimmte Rollen angezeigt werden. Weißt du, wie ich eine Referenz zu meinem Master für den IPrincipal hinzufügen kann? – Ben

+2

Verwenden Sie 'HttpContext.Current.user' oder' ViewContext.HttpContext.User' - das sollte den Trick machen :-) – Charlino

+0

Ahh, jetzt kann ich mit den Dingen weitermachen ... Ich schätze die Hilfe! – Ben

2

Dies ist eine Sache, die ich mit MVC nicht wie wirklich (wie in ASP.Net MVC, nicht das Muster) ein tendancey von UI-Logik in das Markup zu verschieben.

Es gibt keine Möglichkeit, Unit-Tests für diese Logik auszuführen, sobald sie im aspx enthalten sind.

Persönlich denke ich Webforms mit einem geeigneten UI-Muster (MVC oder MVP etc) würde besser passen als die Seite mit bedingter Logik übersät, die nicht getestet werden kann.

+1

Da ich mich immer noch als Anfänger betrachte, werde ich immer besser und ich stimme dem überein, was du sagst, und habe meine Markup-Seiten überschwemmt. Ich arbeite in Webforms bei meinem Job und MVC bei meinen freiberuflichen Projekten und habe viele widersprüchliche Kopfschmerzen, wenn ich gleichzeitig lerne. Obwohl ich nicht viel darüber gelernt habe, wie man einen Unit-Test durchführt - ich werde ihn zweifellos in naher Zukunft brauchen; und ich hoffe, bis dahin wird das MVC-Team das angesprochen haben. Danke für den Kommentar +1 -ben – Ben

+2

Verwenden Sie Selenium für UI-Tests. Sie können Tests mit verschiedenen Rollen ausführen und dann auf das Vorhandensein von HTML-Steuerelementen testen (hey, das reimt sich). – Bob

1
<% if(HttpContext.Current.User.IsInRole("Admin")){%> <a href="/Admin">Admin</a> <% } %> 

Verwenden Sie diesen Code. Das ist einfacher.

0

Ich verwende eine statische Klasse für die Validierung der Rolle und in der cshtml ich diese Klasse verwendet, ist die Rollenvalidierung aus der cshtml.

Ich habe meine autorisierten Funktionen oder Inhalte in der Datenbank (nach Benutzer oder nach Rolle), so dass Sie nicht erneut implementieren müssen, wenn sich die Zugriffsdefinition ändert.

public static class AuthorizeContent 
{ 
    public static bool AuthorizeAccessContent(string Content) 
    { 
     bool bReturn = false; 
     DBContext db = new DBContext(); 
     string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName); 

     foreach (AuthorizedContentRole aut in db.AuthorizedContentRole) 
     { 
      foreach (string rol in RolesUser) 
      { 
       if (aut.Role==rol && aut.Content==Content) 
       { 
        bReturn = true; 
        break; 
       } 
      } 
     } 
     foreach (AuthorizedContentUser aut in db.AuthorizedContentUser) 
     { 
      if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content) 
      { 
       bReturn = true; 
       break; 
      } 
     } 

     return bReturn; 
    } 

/// in der cshtml

@if (AuthorizeContent.AuthorizeAccessContent(Content)) 
{ 

    <li class="two"> 
     <h5>Administrator link</h5> 
     @Html.ActionLink("Admin secret info","Index", "Information") 
    </li> 
} 

Sie auch einen Filter wie [AccionAuthorize (Action = "myCONTENT")]

public class AccionAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Action { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     else if (!AutorizacionContenido.AutorizaAccesoContenido(Action)) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     base.OnAuthorization(filterContext); 
    } 
} 
Verwandte Themen