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

你可以做到这一点的一种方法(这是我在当前项目中使用的一个例子)是创建你自己的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

您始终可以重定向到错误页面并显示适当的消息。

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!!!
}

在您的错误页面中(应该在共享视图文件夹中有一个),您可以添加以下行

@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 回答
0

您可以使用 AJAX 请求来调用该EditPage操作。如果授予权限,它可以返回回调以重定向到完整的编辑页面(到类似的操作EditPageView)。否则,可能会返回对错误消息的回调。

于 2012-05-18T15:23:58.780 回答