2009-09-24 7 views
5

Używam niestandardowego filtru autoryzacji na moich kontrolerach ASP.NET MVC, który przekierowuje użytkownika do adresu URL innego niż ekran logowania, jeśli nie uda się autoryzować konkretnej akcji.Jak radzisz sobie z autoryzacją działań, które zwracają wyniki inne niż ViewResult?

Jest to możliwe w przypadku akcji, które zwracają widoki, ale wiele moich działań zwraca inne typy wyników, takie jak PartialResult lub JsonResult.

Mój obecny filtr wygląda następująco:

< AuthorizeWithRedirect (Role: = "serveraccess" Kontroler: = "Home", Działanie: = "nieuprawniony") >

To wskazuje że jeśli użytkownik nie znajduje się w roli ServerAccess, to powinien zostać przekierowany do/Home/Unauthorized/

Jestem ciekawy, jak radzą sobie z tym inni ludzie? Wydaje się to szczególnie problematyczne, gdy weźmie się pod uwagę liczbę akcji, które mają być wywoływane tylko przez wywołania AJAX skryptów po stronie klienta. W jaki sposób/Home/Unauthorized/action może wiedzieć, czy osoba dzwoniąca miała otrzymać widok, partialview, json, zawartość itp.?

Odpowiedz

1

Myślę, że będziesz musiał przekazać te informacje wraz z przekierowaniem.

Kilka sposobów można sobie z tym poradzić:

  • Rozważyć oddzielne metody działania dla każdego typu odpowiedzi, czego potrzebujesz - UnauthorizedJson, UnauthorizedHtml, UnauthorizedEtc ... że odzwierciedla oryginalne odpowiedzi typu akcja

  • Pass w formacie informacji z przekierowaniem dodając kolejny parametr do metody nieuprawnione i dołączenie jej do adresu URL w filtrze

+0

Pierwsza opcja to trasa, którą aktualnie wykonałem, z działaniem kontrolera dla każdego typu ActionResult tj. UnauthorisedPartial, UnauthorisedJSON. Pozwala mi to napisać jedną standardową stronę i zwrócić ją każdemu dzwoniącemu. – Nick

9

Zastosowanie Request.IsAjaxRequest(), np .:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public AjaxAuthorizeAttribute() : base() 
    { 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Extends the original Web.MVC.AuthorizeAttribute for Ajax calls. 
     // Basically if the request is not authorized and the request is an AJAX Request. 
     // then we simply set the stats Code to 403 and set an empty Result, in order to 
     // determine in Javascript if the AJAX call came back completed and valid. 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
       && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

Note 403, nie 401, ponieważ ASP.NET przechwytuje 401s i zamienia je na stronach błędów HTML. Nie ma znaczenia, jakie oczekiwane jest oczekiwanie na połączenie AJAX; nadal może zobaczyć kod statusu.

+0

Powrót 403 jest interesującym podejściem, którego nie rozważałem. Sądzę, że to nakłada obowiązek na skrypt klienta, aby wygenerować odpowiedni komunikat dla użytkownika. – Nick

+0

Ten atak jest zawsze obecny w AJAX, bez względu na to, jak to robisz. –

Powiązane problemy