【问题标题】:Authorize a parameter for an action in MVC5为 MVC5 中的操作授权参数
【发布时间】:2014-09-11 04:58:24
【问题描述】:

我通常需要授权在 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

是否有现成的属性或教程来说明如何实现?如果没有,这不是可取的吗?

【问题讨论】:

  • 是的,这可以通过覆盖Authorize 属性来实现。如果明天之前您还没有得到答复,我将针对此特定问题发布一些代码。
  • @Shoe 谢谢...我不知道AuthorizeAttribute 应用于参数...

标签: asp.net-mvc asp.net-mvc-5 authorize-attribute


【解决方案1】:

您可以通过创建 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)
{
    ...
}

另一种选择是创建自定义 ActionFilterIActionFilter 的实现)。一个 ActionFilter 实现了两种方法:

  • OnActionExecuting 在 action 方法之前执行
  • OnActionExecuted 在操作方法执行后立即执行。

因此,您可以通过以下方式进行必要的验证:

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)
{
    ...
}

【讨论】:

  • 感谢您的详细解答。今天我会试一试。
猜你喜欢
  • 2016-05-10
  • 2014-01-17
  • 2014-01-20
  • 2016-12-19
  • 2015-05-10
  • 1970-01-01
  • 2011-07-29
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多