2013-03-27 12 views
6

W moim filterConfig zarejestrowałem globalny filtr atrybutów, który wymaga autoryzacji dla każdej z moich metod.Zastępowanie globalnego filtru w MVC dla jednej metody

Jednak mam jedną konkretną metodę, w której chcę zastosować inny atrybut filtru autoryzacji. Jak to osiągnąć, jeśli to w ogóle możliwe?

Uwaga: Nie chcę używać atrybutu [AllowAnonymous] (który działa bezproblemowo i całkowicie ignoruje mój filtr), ponieważ chcę, aby żądanie było autoryzowane, za pośrednictwem innego zestawu logiki autoryzacji dla tej metody.

+0

Nie zajmowałem się filtrami, ale czy to zadziała? http://msdn.microsoft.com/en-us/library/b6x6shw7(v=vs.71).aspx Używam elementów lokalizacji do ominięcia autoryzacji na kilku stronach. – Pete

Odpowiedz

4

można zmienić filtr aby umożliwić wielu ustawiając AllowMultiple = true w atrybucie AttributeUsage na swojej klasy atrybutu i dodaj czek tak, że jeśli filtr jest obecne kilka razy, globalnie zastosowano jeden nie wykonuje się. Przekaźnik ActionExecutingContext, który zostanie przekazany do OnActionExecuting(), umożliwia pobranie filtrów za pośrednictwem filterContext.ActionDescriptor.GetCustomAttributes(), dzięki czemu można z nich korzystać tutaj.

Następnie zmień konstruktor, aby można było przekazać parametr (prawdopodobnie wyliczenie), którego może użyć do określenia, która metoda autoryzacji ma być używana - normalna lub inna. Nadaj temu parametrowi wartość domyślną, która sprawia, że ​​wybiera ona zwykłą metodę auth. Następnie, w tej metodzie, która wymaga innej metody uwierzytelniania, można zastosować filtr z inną wartością parametru. Więc może wyglądać tak:

public class CustomAuthAttribute : AuthorizeAttribute 
{ 
    public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth) 
    { 
     //stuff 
    } 
} 

[CustomAuth(AuthMethod.WeirdAuth)] 
public ActionResult MethodThatNeedsDifferentAuth() 
{ 
    //stuff 
} 
+0

Czy jest jakiś sposób na zrobienie tego bez modyfikowania pierwotnie utworzonego CustomAttribute? – badazzhindu

+0

Czy nadal możesz podać wartość? Erm ... cóż, domyślam się, że możesz dziedziczyć po tej oryginalnej wersji i dodać dodatkowy konstruktor, a następnie przesłonić metody z wersji podstawowej, zrobić logikę, która wybiera jedną metodę auth lub drugą, a następnie, gdy chcesz wywołać logika z oryginalnej wersji, którą można nazwać 'base.Authorize()' lub dowolną inną metodą. – anaximander

+0

@anaximander można wysłać kod o tym, jak sprawdzić czek, więc stosowane globalnie nie wykonać –

2

można napisać własną wersję atrybutu autoryzować i przekazać konkretnego parametru do zależności, jakie działania chcesz swój atrybut zrobić na przykład

public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     public string currentAction { get; set; } 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (currentAction != "notallowed") 
      { 
       HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    } 

protected override void HandleUnauthorizedRequest(AuthorizationContext context) 
    { 
     context.Result = new RedirectResult("/home/login"); 
    } 

a następnie zastosować go do swojej klasy lub działania

[CustomAuthorize(currentAction = "notallowed")] 
public class HomeController : Controller 
+0

Używam tego z Web API 2 - ale musiałem dodać [OverrideAuthorizationAttribute] do kontrolera –

Powiązane problemy