答えまたは少なくとも簡単な修正を探している人向け。これが5分後に私が思いついたものであり、これが持つ可能性のある副作用についてはほとんど考えていません.
routes.MapNavigationRoute<HomeController>("Index", c => c.Index())
.FilterRoute(() => !WebSecurity.IsAuthenticated);
FilterRoute() への呼び出しですべてのフィルタリングを行うか、さらに拡張メソッドを追加して文字数を節約することができます。
私は .RequireRole("管理者"); を考えています。WebSecurity.RequireRoles() を順番に呼び出す (または HttpContext.Current.User.IsInRole()) など。
public static NavigationRouteBuilder FilterRoute(this NavigationRouteBuilder builder, Func<bool> func)
{
var currentRoute = builder._parent;
NavigationRoutes.Filters.Add(new BootstrapAuthorizationFilter(builder, x =>
{
if (x == currentRoute)
return func();
else
return false;
}));
return builder;
}
BootstrapAuthorizationFilter は、その ShouldRemove() メソッドで func() を呼び出す INavigationRouteFilter を実装する単なるクラスです。
public class BootstrapAuthorizationFilter : INavigationRouteFilter
{
private NavigationRouteBuilder builder;
private Func<NamedRoute, bool> func;
public BootstrapAuthorizationFilter(NavigationRouteBuilder builder, Func<NamedRoute, bool> func)
{
this.builder = builder;
this.func = func;
}
public bool ShouldRemove(Route navigationRoutes)
{
if (navigationRoutes is NamedRoute)
return func(navigationRoutes as NamedRoute);
return false;
}
}
明らかに空想的なものはなく、本番環境で使用するかどうかはわかりません. しかし、私は十分にシンプルで機能すると思います(私がテストした場合)。そうは言っても、新しいルーティング機能がすぐにリリースされることを願っています:)