ActionFilterAttribute - применять к действиям определенного типа контроллера - PullRequest
13 голосов
/ 17 сентября 2009

Я использую ActionFilterAttribute для выполнения пользовательской логики аутентификации. Атрибут будет использоваться только в производном классе Controller, который содержит мою логику аутентификации.

Вот мой контроллер, полученный из моего пользовательского класса контроллера, и пример атрибута:

public class MyController : CustomControllerBase
{

   [CustomAuthorize(UserType = UserTypes.Admin)]
   public ActionResult DoSomethingSecure()
   {
      return View();
   }

}

Вот пример моего ActionFilterAttribute:

public class CustomAuthorizeAttribute : ActionFilterAttribute
{
   public MyUserTypes UserType { get; set; }

   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
      myUser user = ((CustomControllerBase)filterContext.Controller).User;

      if(!user.isAuthenticated)
      {
         filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
      }
   }
}

Отлично работает.

Вот вопрос: Могу ли я требовать, чтобы этот атрибут использовался ТОЛЬКО в Действиях в моем пользовательском типе контроллера?

Ответы [ 2 ]

16 голосов
/ 17 сентября 2009

Вы можете поместить ActionFilter в сам класс. Все действия в классе будут реализованы ActionFilter.

[CustomAuthorize]
public class AuthorizedControllerBase : CustomControllerBase
{
}

public class OpenAccessControllerBase : CustomControllerBase
{
}

public class MyRealController : AuthorizedControllerBase 
{
    // GET: /myrealcontroller/index
    public ActionResult Index()
    {
        return View();
    }
}
7 голосов
/ 18 сентября 2009

Исходя из комментариев и ограничений моей системы, я выбрал гибридный подход. По сути, если запрос поступает по кешированному маршруту или «Пользователь» не установлен по какой-либо причине, проверка подлинности завершается неудачно.

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
  private MyUser User { get; set; }

  public override void OnAuthorization(AuthorizationContext filterContext)
  {
    //Lazy loads the user in the controller.
    User = ((MyControllerBase)filterContext.Controller).User;

    base.OnAuthorization(filterContext);
  }

  protected override bool AuthorizeCore(HttpContextBase httpContext)
  {
    bool isAuthorized = false;
    string retLink = httpContext.Request.Url.AbsolutePath;

    if(User != null)
    {
      isAuthorized = User.IsValidated;
    }

    if (!isAuthorized)
    {
      //If the current request is coming in via an AJAX call,
      //simply return a basic 401 status code, otherwise, 
      //redirect to the login page.
      if (httpContext.Request.IsAjaxRequest())
      {
        httpContext.Response.StatusCode = 401;
      }
      else
      {
        httpContext.Response.Redirect("/login?retlink=" + retLink);
      }
    }

    return isAuthorized;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...