【发布时间】: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 请求。我选择这个有两个原因:
用户在失去权限之前加载了页面,因此不加载禁止的部分视图。如果 POST 上没有
RedirectToRouteResult,即使没有权限,他们也可以 POST。有人可能会尝试过度发布该页面并获得一些成功,如果他们点击了一些包含的值。
属性:
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