【问题标题】:Redirect to "You Are Forbidden" page without changing URL ASP.NET MVC重定向到“你被禁止”页面而不更改 URL ASP.NET MVC
【发布时间】:2017-11-27 05:12:11
【问题描述】:

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

我现在是怎么做的。它发送到 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. 用户在失去权限之前加载了页面,因此不加载禁止的部分视图。如果 POST 上没有 RedirectToRouteResult,即使没有权限,他们也可以 POST。

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

属性:

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

【问题讨论】:

  • 而不是重定向,也许您可​​以根据网站大小加载部分内容

标签: c# asp.net-mvc permissions


【解决方案1】:

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

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

<div id="forbidden">

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

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

【讨论】:

  • 确实考虑了部分,但想知道我的结构中是否还有其他方法。这样做,我需要有两种不同的授权属性...一种将一些 ViewData 发送到filterContext.Controller.ViewBag,另一种实际上不允许您触摸控制器。我最初这样做是为了防止有人在未经许可的情况下发布到页面。我相信如果有部分视图但 URL 相同,那么仍然有人可以潜入该 URL 的 POST,对吗?所以我想我会在 POST 和 GET 上有一个……如果这有意义的话。
  • 实际上,我想我只是改变我的属性来处理两种不同的请求类型...... GET / POST...... 做两种不同的事情。感谢您的启发。
  • 是的,我用 [HttpGet] 装饰动作应该会阻止发布到它。
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多