Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向到";“你是被禁止的”;不更改URL的页面ASP.NET MVC_C#_Asp.net Mvc_Permissions - Fatal编程技术网

C# 重定向到";“你是被禁止的”;不更改URL的页面ASP.NET MVC

C# 重定向到";“你是被禁止的”;不更改URL的页面ASP.NET MVC,c#,asp.net-mvc,permissions,C#,Asp.net Mvc,Permissions,我在项目中设置了一个自定义授权属性,以对用户的权限进行一些检查。如果不允许他们执行某项活动,他们将通过RedirectToRouteResult被重定向到“您被禁止”页面。但是,我希望在不更改URL的情况下实现此功能,以便用户在获得权限时可以刷新页面。这可能吗 我现在是怎么做的。它发送到URL禁止/ [AttributeUsage(AttributeTargets.Method)] public class AuthActivityAttribute : ActionFilterAttribut

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

我现在是怎么做的。它发送到URL
禁止/

[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
}
编辑/解决方案:

最后,我对GET请求使用了呈现
PartialView
,对POST请求使用了呈现
RedirectToRouteResult
。我选择这个有两个原因:

  • 用户在失去权限之前加载了页面,因此未加载禁止的部分视图。如果没有帖子上的
    RedirectToRouteResult
    ,即使他们没有权限也可以发布帖子

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

  • 属性:

    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==“禁止”)
    {
    ViewBag.Title=“禁止!”;
    @Html.Partial(“~/Views/Home/problemed.cshtml”);
    }
    其他的
    {
    }
    
    一个部分是正确的选择。在页面中添加类似以下内容的部分:

    @if(ViewData["FORBIDDEN"] == true)
    {
    
    <div id="forbidden">
    
    <div/>
    }
    else{
    rest of page here
    }
    
    @if(ViewData[“禁止”]==true)
    {
    }
    否则{
    这里是本页的其余部分
    }
    

    在您的动作中检查权限并设置基于它的而不是重定向的VIEWDATA(“禁止”),也许您可以根据站点SIEZDID加载部分,考虑部分,但想知道在结构中是否存在另一种方法。这样做,我需要有两个不同的授权属性。。。将一些视图数据发送到

    过滤器Context.Controller.ViewBag
    的一个,以及实际上不允许您触摸控制器的一个。我这样做最初是为了防止有人在未经允许的情况下发布到该页面。我相信,如果有一个部分视图,但是相同的URL,有人仍然可以偷偷地在该URL上发布帖子,对吗?所以我想我会有一个帖子和一个GETs。。。如果这有意义的话。实际上,我想我会改变我的属性来处理两种不同的请求类型。。。获取/发布。。。做两件不同的事情。谢谢你的启发。是的,我用[HttpGet]来装饰这个动作应该可以防止向它发送帖子。
    @if(ViewData["FORBIDDEN"] == true)
    {
    
    <div id="forbidden">
    
    <div/>
    }
    else{
    rest of page here
    }