2012-10-25 14 views
5

Z jakiegoś powodu wywoływana jest tylko metoda OnAuthorization, ale nie jest używana AuthorizeCore.
to jak ja to nazywam:Przesłanianie AuthorizeCore z AuthorizeAttribute nie jest wywoływane

[AuthorizeWithRoles(Roles = "Affiliate")] 
public string TestOnlyAffiliate() 
{ 
    return "ok"; 
} 

jest to rzeczywista atrybut.

public class AuthorizeWithRolesAttribute : AuthorizeAttribute 
{ 

    public string Roles { get; set; } 

    // 
    //AuthorizeCore - NOT INVOKING! 
    // 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return true; 
    } 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 

    } 
} 

Odpowiedz

-1

Nie wiem, czy to pomaga w ogóle, ale wpadłem na tej samej rzeczy i ustalił, że, przynajmniej dla moich celów, nie trzeba zastąpić AuthorizeCore w ogóle. Nie jestem pewien, dlaczego tak jest, szczerze mówiąc. Jak MSDN mówi, OnAuthorization jest wywoływana "gdy proces żąda autoryzacji". Oznacza to, że będzie on wywoływany dla każdej metody, która ma atrybut AuthorizeWithRoles. Możesz umieścić swój niestandardowy kod w OnAuthorization, aby sprawdzić, czy użytkownik ma uprawnienia, a ponieważ możesz uzyskać httpContext z filtersContext, to naprawdę nie ma potrzeby dla AuthorizeCore. Oto prosty przykład, który działa dla mnie:

public class LoginRequired : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (Common.ValidateCurrentSession(filterContext.HttpContext)) 
     { 
      //this is valid; keep going 
      return; 
     } 
     else 
     { 
      //this is not valid; redirect 
      filterContext.Result = new RedirectResult("/login"); 
     } 
    } 
} 

Mam nadzieję, że to pomaga. Poza tym oczywiście musisz zadeklarować, że OnAuthorization jest nadpisaniem.

EDYCJA: Wierzę, że podstawowa metoda OnAuthorization wywołuje AuthorizeCore. Ponieważ nadpisujesz OnAuthorization, oczywiście połączenie jest tracone. Uważam, że nadpisanie AuthorizeCore byłoby istotne tylko wtedy, gdy opuściłeś OnAuthorization samodzielnie lub jeśli wywołałeś base.OnAuthorization (filterContext) w ramach metody nadpisanej.

+0

-1 Nie powinieneś nadpisywać 'OnAuthorization', wprowadzasz problem bezpieczeństwa. Zobacz moją odpowiedź. – Stijn

9

Nie należy zastępować OnAuthorization. Zajmuje się potencjalnymi problemami z buforowaniem i wywołuje AuthorizeCore.

http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/1acb241299a8#src/System.Web.Mvc/AuthorizeAttribute.cs

// In the worst case this could allow an authorized user 
// to cause the page to be cached, then an unauthorized user would later be served the 
// cached page. 

Połóż niestandardową logikę w AuthorizationCore.

+1

Problem z przechodzeniem do 'AuthorizeCore' polega na tym, że tracisz' filterContext', czy nie możesz po prostu wywołać 'base.OnAuthorization (filterContext);' na początku twojego przesłonięcia 'OnAuthrization', aby upewnić się, że ta pamięć podręczna jest nie ma problemu? –

Powiązane problemy