19 Stimmen

MVC rollenbasiertes Routing

Ich habe ein Projekt mit 2 Bereichen /Admin und /User.

Die Standardroute des Administrators lautet /Admin/Home/Index und die Standardroute des Benutzers lautet /Benutzer/Home/Index .

Ist es möglich, Routing zu implementieren, um ihre Home-URL so aussehen zu lassen /Profil/Index sondern um Inhalte aus /Admin/Home/Index für Administratoren und /Benutzer/Home/Index für die Nutzer?

update

Endlich herausfinden, wie man es macht

context.MapRoute(
    "Admin",
    "Profile/{action}",
    new { area = AreaName, controller = "Home", action = "Index" },
    new { RoleConstraint = new Core.RoleConstraint() },
    new[] { "MvcApplication1.Areas.Admin.Controllers" }
);
...
context.MapRoute(
    "User",
    "Profile/{action}",
    new { area = AreaName, controller = "Home", action = "Index" },
    new { RoleConstraint = new Core.RoleConstraint() },
    new[] { "MvcApplication1.Areas.User.Controllers" }
);

public class RoleConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        string roleName = db.GetRoleByUserName(httpContext.User.Identity.Name);
        string areaName = route.Defaults["area"].ToString();
        return areaName == roleName;
    }
}

Es funktioniert, aber für mich ist es nicht der MVC-Weg. Weiß jemand, wie man es richtig zu tun?

4voto

detroitpro Punkte 3793

Ja. Das von Ihnen gezeigte Beispiel kommt vielen der von Microsoft bereitgestellten Beispiele für die Verwendung von Route Constraints sehr nahe. Die Routing-Engine fungiert als Pre-Proxy (oder Router, wenn Sie so wollen), bevor die Anfrage an ein Steuerelement weitergeleitet wird. Elemente wie IRouteConstraint sind so definiert, dass Sie genau das tun können, was Sie beschrieben haben.

3voto

hsrob Punkte 169

Mir gefällt diese Lösung, aber man sollte bedenken, dass das Routing selbst nicht als einzige Form der Sicherheit verwendet werden sollte. Denken Sie einfach daran, dass Sie Ihre Controller und Aktionen mit dem [Authorize]-Attribut sichern sollten, oder wie auch immer Sie den Zugriff einschränken.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X