重定向到“You Are Forbidden”页面而不更改URL ASP.NET MVC

时间:2017-06-23 15:01:22

标签: c# asp.net-mvc permissions

我在项目中设置了一个自定义授权属性来对用户的权限进行一些检查。如果不允许他们执行某项活动,则会通过RedirectToRouteResult将其重定向到“您被禁止”页面。但是,我想在不更改URL的情况下创建此功能,以便用户在获得权限时可以刷新页面。这可能吗?

我现在是怎么做的。它会发送到网址Forbidden/

[AttributeUsage(AttributeTargets.Method)]
public class AuthActivityAttribute : ActionFilterAttribute
{
    public string ActivityName { get; set; }
    public int ActivityId = 0;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!ViewIsAuthorizedActivity(ActivityName))
        {
            filterContext.Result = Forbid();
            base.OnActionExecuting(filterContext);
        }
    }

    public RedirectToRouteResult Forbid()
    {
        return new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    { "controller", "Home" },
                    { "action", "Forbidden" },
                    { "Activity", ActivityId },
                    { "area", ""}
                });
    }
    // other stuff
}

编辑/解决方案:

我最终使用了渲染PartialView用于GET请求和RedirectToRouteResult用于POST请求的组合。我选择这个有两个原因:

  1. 用户在失去权限之前已加载页面,因此未加载Forbidden局部视图。如果POST上没有RedirectToRouteResult,即使他们没有权限,他们也可以POST。

  2. 有人可能会尝试过度发布页面,如果他们点击了一些包含的值,就会取得一些成功。

  3. 属性:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!ViewIsAuthorizedActivity(ActivityName))
        {
            string requestMethod = filterContext.HttpContext.Request.HttpMethod;
    
            if (requestMethod == "GET")
            {
                filterContext.Controller.ViewBag.Authorization = "FORBIDDEN";
            }
            else if (requestMethod == "POST")
            {
                filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {
                        { "controller", "Foo" },
                        { "action", "Bar" },
                        { "area", ""}
                    });
            }
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    查看:

    @if (ViewBag.Authorization == "FORBIDDEN")
    {
        ViewBag.Title = "Forbidden!";
        @Html.Partial("~/Views/Home/Forbidden.cshtml");
    }
    else
    {
        <!-- Page -->
    }
    

1 个答案:

答案 0 :(得分:1)

部分是要走的路。在页面中添加部分内容,如下所示:

@if(ViewData["FORBIDDEN"] == true)
{

<div id="forbidden">

<div/>
}
else{
rest of page here
}

在您的操作中检查权限并根据它设置ViewData [&#34; FORBIDDEN&#34;]