0

フロントエンドとバックエンドを備えたMVC3Webアプリケーションがあります。バックエンドでは、各アクションは、ユーザーがログインしていない場合(セッションをチェックする場合)に別のアクションにリダイレクトするif..then..elseで保護されます。これは、Windowsの役割なしで実行されます。

各アクションに同じコードを何度も挿入しなくても、チェックを実行してユーザーをログインページにリダイレクトする属性を作成できるかどうか疑問に思いました。

編集#1

管理者コントローラーが派生したベースコントローラーを作成し、ウイルスが言ったことに続いて次のメンバーを追加しました。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        try
        {
            if (Session["loggedIn"] == null || (bool)Session["loggedIn"] != true)
            {
                TempData["targetAction"] = ControllerContext.ParentActionViewContext.RouteData.Values["action"] + "/" + ControllerContext.ParentActionViewContext.RouteData.Values["controller"];
                RedirectToRoute("Admin/Login");
            }
        }
        catch (NullReferenceException)
        {
            RedirectToRoute("Admin/Login");
        }
    }

しかし、このコードは機能しません。誰かが何が悪いのか教えてもらえますか?

4

2 に答える 2

6

これは簡単にできます。

属性を使用する必要はありません

Controllerクラスから継承される共通のBaseControllerを作成し、BaseControllerからすべてのコントローラーを継承するだけです。

BaseControllerのOnActionExecutingイベントをオーバーライドし、その上に認証ロジックを配置します。

OnActionExecutingイベントは、アクションが呼び出されるたびに実行されます。

アクションにリダイレクトする必要がある場合は、このコードが役立ちます

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Account" } });
于 2012-07-14T03:51:14.510 に答える
0

それが、組み込みのAuthorizeAttributeフィルターの機能です。

AuthorizeAttributeフィルターは、グローバル レベル、コントローラー レベル、さらにはアクション レベルでも使用できます。組み込みの Authorize フィルターでは不十分な場合は、この投稿で説明されているように、継承することでカスタム フィルターを簡単に作成できます。

于 2012-07-14T06:04:36.440 に答える