0

ビュー「x」から、ユーザーが「アイテムの編集」をクリックすると、「編集」ページをレンダリングするコントローラーアクションは、そのページに対するユーザーの権限もチェックします。

私がやろうとしているのは、それらのアクセス許可を確認することです。ユーザーがそれらのアクセス許可を持っていない場合は、その「X」ビューにエラーメッセージを表示し、コントローラーのアクションをキャンセルします。

現在、私のコードは次のようになっています。

 [HttpPost]
    public virtual ActionResult EditPage(int? itemId)
    {
        var model = new EditPageModel();
        if (itemId.HasValue)
        {
            var obj = new Item(itemId.Value);

   // Check for user's edit permission before we do anything else.

     var request = SecurityRequest.Create(obj, Item_Edit);
     Request.Execute(() => SecurityManager.ValidatePermissions(request));
            if (!request.IsValid(Item_Edit))
            {
                //skip the rest and return error
                Response.StatusCode = (int)HttpStatusCode.Forbidden;
                // Need Help Here!!!
            }

      // Mode code executes      
      return View(model);
    }
4

3 に答える 3

1

これを行う1つの方法(そしてこれは私が現在のプロジェクトで使用しているものの例です)は、独自のを作成することActionFilterです。これが私の例です:

public class UserAuthenticatedAction : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (IsContextFromLoginController(filterContext))
        {
            return;
        }

        //...Do whatever you need to check.

        if (userNotAllowed){
            SetRedirectToLoginErrorPageForContext(filterContext);
        }

        return;
    }

    private static void SetRedirectToLoginErrorPageForContext(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    { "controller", "Login" },
                    { "action", "LoginError" },
                    { "targeturl" , filterContext.RequestContext.HttpContext.Request.Url.ToString()} }
                });
    }

    private static bool IsContextFromLoginController(AuthorizationContext filterContext)
    {
        var controllerName = GetCurrentControllerName(filterContext);

        return controllerName.Equals("Login");
    }

    private static string GetCurrentControllerName(AuthorizationContext filterContext)
    {
        return filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    }
}

このフィルターを使用するには、global.asax.csファイルに次の行がありApplication_Start()ます。

GlobalFilters.Filters.Add(new UserAuthenticatedAction(excludeActions, allowedRoles));

つまり、ActionMethodが呼び出されるたびに属性が実行されます。基本的に、ユーザーが特定のURLへのアクセスを許可されているかどうかを確認し、そのユーザーが許可されていない場合は、ユーザーをfilterContextログインページにリダイレクトするように設定されます。

また、現在のURLがすでにログインページであるかどうかも確認します。その場合は、セキュリティチェックをわざわざ行わないでください。

要件に応じて、これを行うためのより凝った方法があると思いますが、上記の方法は私たちのニーズには問題なく機能します。

于 2012-05-18T15:27:41.550 に答える
0

AJAXリクエストを使用してEditPageアクションを呼び出すことができます。権限が付与されている場合、完全な編集ページ(のようなアクションEditPageView)にリダイレクトするためのコールバックを返す可能性があります。そうしないと、エラーメッセージへのコールバックが返される可能性があります。

于 2012-05-18T15:23:58.780 に答える
0

エラーページにいつでもリダイレクトして、適切なメッセージを表示できます。

if (!request.IsValid(Item_Edit))
{
     //skip the rest and return error
     Response.StatusCode = (int)HttpStatusCode.Forbidden;
     ViewBag.errorMessage = "Sorry you do not have access to this page";
     return View("Error")
     // Need Help Here!!!
}

また、エラーページ(共有ビューフォルダに1つあるはずです)に次の行を追加できます

@ViewBag.errorMessage

編集

エラーページにリダイレクトしてページxに留まりたくない場合は、次の操作を実行できます。

if (!request.IsValid(Item_Edit))
{
     //skip the rest and return error
     Response.StatusCode = (int)HttpStatusCode.Forbidden;
     ModelState.AddModelError("", "Sorry you do not have access to this page");
     ModelForPageX modelX = new ModelForPageX();
     // do any other setup you need to in order to render page X
     return View("X",modelX)

}

@Html.ValidationSummaryこれは、次の行を追加しない場合、ページXのビューにあることを前提としています

@Html.ValidationSummary(true, "Unable to process the requested action:")
于 2012-05-18T16:18:13.523 に答える