Używam ActionFilterAttribute do wykonania niestandardowej logiki uwierzytelniania. Atrybut będzie używany tylko w pochodnej klasie kontrolera, która zawiera moją logikę uwierzytelniania.ActionFilterAttribute - zastosowanie do działań określonego kontrolera typu
Oto mój Controller, pochodzące z mojej klasy niestandardowej kontrolera, a atrybut próbki:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
Oto przykład mojego 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;
}
}
}
działa świetnie.
Oto pytanie: Czy mogę wymagać, aby ten atrybut był WYŁĄCZNIE używany w działaniach w moim niestandardowym typie kontrolera?
Twój atrybut jest uszkodzony, ponieważ nie dziedziczy z AuthroizeAttribute i nie można zagwarantować, że będzie działał, gdy czynność zostanie zapisana w pamięci podręcznej. Zobacz http://blogs.teamb.com/craigstuntz/2009/09/09/38390/ dla rozwiązań, które działają z buforowaniem. –
Dlaczego wynik działania byłby buforowany? –
Zostanie zbuforowany, ponieważ ktoś powiedział, że ma być buforowany. Wyobraź sobie, że ktoś umieszcza atrybut Cache na klasie nadrzędnej, nie zauważając złamanego atrybutu podtypu. O wiele lepiej jest używać atrybutu, który nie jest zasadniczo niezgodny z buforowaniem ASP.NET/MVC. Zobacz link powyżej, aby uzyskać opcje. –