2
public static void RegisterRoutes(RouteCollection routes)
           {
               routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
               routes.MapRoute(
                   "Default", // Route name
                   "{controller}/{action}/{id}", 
                   new { controller = "User", action = "Index", id = UrlParameter.Optional } 
               );

           }

現在のユーザーが管理者の場合、ルート URL を入力すると、管理者ページにリダイレクトされますか???

4

2 に答える 2

2

多くの方法があります (ほとんどはカスタム) が、デフォルトの MVC 機能を使用してルートをそのまま維持し、セキュリティ ロールに応じて 2 つのコントローラー アクションを使用します。

// actions part of UserController

public ActionResult Index()
{
    ...
}

[Authorize(Roles = "admin")]
[ActionName("Index")]
[AdminsOnly]
public ActionResult IndexAdmin()
{
    ...
}

これにより、ユーザーが特定のロールのメンバーになると、2 つ目が自動的に実行されます。ただし、特定のユーザー (管理者) しかいない場合は、その属性を次のように変更できます。

[Authorize(Users = "admin")]

カスタム メカニズムを使用してユーザー タイプ/ロール メンバーシップを定義している場合は、いつでも独自の承認アクション フィルターを作成できます。

ただしAuthoriseAttribute、アクション セレクター フィルターではないため、カスタム アクション セレクター フィルターを作成しないと、MVC は 2 つを区別できませんAdminsOnlyAttribute。これはあなたに代わってチェックを行い、リクエストに対して複数のアクションがあったというエラーは発生しません. このカスタム フィルターを作成する場合はAuthorizeAttribute、アクション セレクターが既にチェックしているため、単純に を削除することもできます。

その他の候補

カスタムRoute

Routeこれが望ましくない場合は、ユーザー名/ロールのメンバーシップに応じてユーザーを特定の領域にリダイレクトする独自のカスタム クラスをいつでも作成できます...リダイレクトはLoginアクションの一部である可能性もありますが

[HttpPost]
public ActionResult Login(LoginCredentials user)
{
    // authenticate
    ...
    if (User.IsInRole("admin"))
    {
        return this.RedirectToAction("Index", "User", new { area = "Admin" });
    }
    return this.RedirectToAction("Index", "User");
}

このアクションは、アプリケーションに管理領域があることを前提としています。

カスタム ルート制約

もう 1 つの可能性は、カスタム ルート制約を設定することです。したがって、実際には 2 つのルートを定義しますが、1 つには特定の制約があります。

routes.MapRoute(
    "Admin", // Route name
    "{controller}/{action}/{id}", 
    new { area = "Admin", controller = "User", action = "Index", id = UrlParameter.Optional },
    new { isAdmin = new AdminRouteConstraint() }
);
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", 
    new { controller = "User", action = "Index", id = UrlParameter.Optional } 
);

このようにして、管理者をアプリケーションの管理領域にルーティングし、そこにある特定の機能を提供できます。しかし、彼らが管理領域を必要としているわけではありません。それが私のルート定義です。ルートのデフォルトは自由に定義できます。

于 2013-01-24T09:35:51.460 に答える
0

このリダイレクトをインデックスアクションに実装できます。

public class HomeController: Controller
{
    public ActionResult Index()
    {
        if (User.IsInRole("admin"))
        {
            // The user is an administrator => redirect him to his own page
            return RedirectToAction("SomeActionName", "SomeControllerName", new { area = "admin" });
        }

        // the use is either not authenticated or not in the admin role => render some view
        return View();
    }
}
于 2013-01-24T09:41:43.913 に答える