我通常需要授权在MVC5中的操作中的服务调用中评估特定参数。例如,假设我的行为是public ActionResult Edit(string partnerName)
。
今天,我总是通过评估if (!User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName)) throw new UnauthorizedException();
但是,我希望能够做到这样的事情:
[Authorize(Roles = THIS_MODULE_ID)]
public ActionResult Edit([AuthorizePartnerModule(THIS_MODULE_ID)] string partnerName)
{
...
}
要清楚,1)我不认为AuthorizeAttribute
如果按照我的设想实施是必要的,2)不存在的东西是AuthorizePartnerModuleAttribute
。< / p>
是否有现成的属性或教程解释如何实现这一目标?如果没有,这是不可取的吗?
答案 0 :(得分:4)
您可以通过创建 AuthorizeAttribute
的子类,使用自定义授权过滤器扩展授权using System.Web;
using System.Web.Mvc;
namespace Filters
{
public class AuthorizePartnerModule : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// getting the parameter from the request
string partnerName = httpContext.Request.Params["groupId"].ToString();
// custom validation
return User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName);
}
}
}
然后,您可以使用以下方法验证您的操作方法:
[AuthorizePartnerModule(Roles = THIS_MODULE_ID)]
public ActionResult Edit(string partnerName)
{
...
}
另一种选择是创建自定义 ActionFilter ( IActionFilter 的实现)。 ActionFilter实现了两个方法:
因此,您可以使用以下内容进行必要的验证:
using System.Web.Mvc;
namespace Filters {
public class AuthorizePartnerModule : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
// getting the parameter from the request
string partnerName = filterContext.ActionParameters["partnerName"].ToString();
// custom validation
if (!User.CanAccessPartnerModule(THIS_MODULE_ID, partnerName))
{
filterContext.Result = new HttpNotFoundResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// do nothing
}
}
}
但是,在这种情况下,你必须这样验证:
[Authorize(Roles = THIS_MODULE_ID)]
[AuthorizePartnerModule]
public ActionResult Edit(string partnerName)
{
...
}