2014-09-11 2 views
2

Мне обычно нужно авторизовать определенный параметр, который будет оцениваться при вызове службы в действии в MVC5. Например, предположим, что мое действие - public ActionResult Edit(string partnerName).Авторизовать параметр для действия в MVC5

Сегодня я справиться с этим, всегда оценивая 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.

Есть ли готовый атрибут или учебник, объясняющий, как это может быть выполнено? А если нет, разве это не рекомендуется?

+0

Да это возможно с помощью переопределяя атрибут Authorize. Если вы не получите ответ завтра, я отправлю код для этой конкретной проблемы. – Shoe

+0

@ Спасибо, спасибо ... Я не знал, что 'AuthorizeAttribute' применяется к параметрам ... –

ответ

3

Вы можете продлить разрешение с фильтром пользовательских разрешений путем создания подкласса 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 реализует два метода:

  • OnActionExecuting выполняется непосредственно перед методом действия
  • 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) 
{ 
    ... 
} 
+0

Спасибо за подробный ответ. Я дам ему вращение сегодня. –