2012-10-14 13 views
11

Attualmente sto sviluppando un'API Web utilizzando il tipo di progetto API Web MVC 4. Sono attualmente in una fase in cui ho bisogno di aggiungere un po 'di sicurezza all'API. Sono a conoscenza dell'attributo Authorize, tuttavia, il cliente preferirebbe un approccio diverso. Per questo ho provato a sovrascrivere l'attributo Authorize nella mia classe e come inizio base ho semplicemente che AuthorizeCore restituisce sempre false che dovrebbero significare non autentificate. Se poi lo aggiungo a un'azione in un controller, l'azione viene sempre completata e recupero sempre i dati. Credo che il motivo potrebbe essere dovuto al fatto che l'attributo personalizzato non è stato registrato nel file web.config, tuttavia, non sono sicuro su come procedere quando non si utilizza l'autenticazione dei moduli.Utilizzo dell'autorizzazione personalizzata in MVC 4

Il codice che sto usando per testare è un nuovo progetto di API Web MVC 4 con l'attributo personalizzato mostrato di seguito.

public class Auth : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return false; 
    } 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectResult("http://www.google.com"); 
    } 
} 

Ho poi aggiunto l'attributo sul metodo Get del difetto ValuesController come tale

[Auth] 
public IEnumerable<string> Get() 

Tuttavia, quando ci si dirige verso dominio/API/Valori io sono sempre presentati con i dati, invece di l'atteso reindirizzamento a google. Qualsiasi aiuto è apprezzato.

Edit: Dopo aver cercato un po 'di più ho trovato questo qui: http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx Questo suggerisce che ho scelto la classe AuthorizeAttribute sbagliato sbagliato, come avevo scelto quello da System.Web.Mvc piuttosto che quello da System.Web.Http . Sembra che la versione Http non consenta lo stesso livello di configurazione della versione MVC in quanto non mi consente di scavalcare AuthorizeCore. Qualsiasi altro aiuto su questo è apprezzato.

+0

Non penso che abbia qualcosa a che fare con la classe AuthorizeAttribute sbagliata. Metti un breakpoint sul "return false;" dichiarazione, eseguire in modalità di debug e vedere se si colpisce quella dichiarazione. – Turnkey

+0

Ho provato questo e il punto di interruzione non viene colpito affatto. Ciò corrisponde al comportamento menzionato nel collegamento che nulla sarebbe accaduto se fosse stato usato l'attributo sbagliato. – bruinbrown

+0

Sì, sembra una differenza di comportamento in WebApi rispetto a MVC. – Turnkey

risposta

9

Sembra che il problema sia stato causato dall'utilizzo della versione errata di AuthorizeAttribute. Dopo aver utilizzato la versione trovata in System.Web.Http, il codice restituisce il codice di errore corretto nel caso in cui l'utente non disponga delle autorizzazioni necessarie. Ad esempio, ecco il codice equivalente a quello che ho inserito nella domanda originale

using System; 
using System.Web.Http; 
using System.Net.Http; 

public class AuthAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     HandleUnauthorizedRequest(actionContext); 
    } 

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect); 
     response.Headers.Add("Location", "http://www.google.com"); 
     actionContext.Response = response; 
    } 
} 
+0

In caso di ulteriore revisione, suggerirei di non gestirlo con i reindirizzamenti ma tramite le intestazioni di risposta standard come indicato nella risposta rivista. Ciò sarà più in linea del comportamento previsto per i client che utilizzano un'API. Quindi il client può eseguire il reindirizzamento o presentare una risposta all'utente. – Turnkey

3

Per WebApi è possibile forzare l'override della classe AuthorizeAttribute corretta specificandola nell'override. Inoltre, non ha senso fare un reindirizzamento, questo restituisce solo la risposta web non autorizzata, che è appropriata per un'API.

namespace WebApiTest 
{ 
    public class Auth : System.Web.Http.AuthorizeAttribute 
    { 
     protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) 
     { 
      return false; 
     } 

    } 
} 
+0

Avrei dovuto dire che ho appena impostato questo per alcuni test di base attualmente, seguo normalmente la convenzione. – bruinbrown