2013-10-03 12 views
47

Który atrybut autoryzacji?
System.Web.Http.Authorize
System.Web.Mvc.Authorize
System.Web.Http.Authorize versus System.Web.Mvc.Authorize

using System.Web.Mvc  // or 
using System.Web.Http 

Typowy regulator

[Authorize] 
    public class SomeController : Controller 

Mamy kontrolerów opatrzone [Authorize] Właśnie zauważyłem, że ze względu na przy użyciu przestrzeni nazw adnotacje odnoszą się technicznie do różnych klas atrybutów.

Projekt zawiera kontrolery MVC i kontrolery WEBAPI.

Których należy użyć i dlaczego? Jakie problemy możemy napotkać, jeśli tego nie naprawię?

Odpowiedz

62

Musisz użyć System.Web.Http.Authorize przeciwko ApiController (Kontroler Web API) i System.Web.Mvc.Authorize przeciwko Controller (kontroler MVC). Ponieważ struktura uruchamia filtry w ramach przetwarzania potoków, a kontrolery oczekują zastosowania odpowiedniego filtru, jeśli nie użyjesz odpowiedniego filtru, autoryzacja nie będzie działać.

+0

Czy masz odniesienie do dokumentacji, na którym opiera się? – Mike

+3

@Mike Może to empirycznie zademonstrować, pisząc 'publiczną zapieczętowaną klasę AuthAttribute: System.Web.Mvc.AuthorizeAttribute { chronione override bool AuthorizeCore (HttpContextBase httpContext) => false; } ', umieszczając go na' ApiController' i ustawiając punkt przerwania w Visual Studio. Zauważ, że 'AuthorizeCore' nigdy nie jest wywoływane i że żądanie jest obsługiwane w miejscu, w którym zostanie odrzucone. –

+0

Należy zauważyć, że MVC i Web API są ** niezależnymi ** frameworkami, dlatego te dwa typy nie są wymienne. Określenie "ram" oznacza, że ​​istnieje tylko jedna struktura, która jest nieprawidłowa i wprowadzająca w błąd. – NightOwl888