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