2014-12-17 10 views
6

Vorrei utilizzare AllowAnonymous e un numero personalizzato AuthenticationFilter. Qualcuno può indicarmi la direzione giusta per utilizzare AllowAnonymous o un'altra alternativa? GrazieCustom IAuthenticationFilter e AllowAnonymous in Web API

Ho creato il mio filtro personalizzato che eredita da System.Attribute e realizza System.Web.Http.Filters.IAuthenticationFilter

public class MyCustomAuthenticationAttribute : Attribute, IAuthenticationFilter 

sono stato in grado di aggiungere con successo la logica per il metodo AuthenticateAsync

public async Task AuthenticateAsync(
    HttpAuthenticationContext context, 
    CancellationToken cancellationToken) {} 

Il mio problema è che ho bisogno di ignorare alcune azioni o controller del mio controller API Web. Ho pensato che potrei usare System.Web.Http.AllowAnonymousAttribute per fare questo. Ad esempio, ecco un esempio molto semplice che mostra l'intento.

[MyCustomAuthentication] 
public class HomeController : ApiController 
{ 
    // no authentication needed allow anonymous 
    [HttpGet] 
    [Route("hianonymous")] 
    [AllowAnonymous] 
    public IHttpActionResult Hello(string name) { 
     return Ok(new { message = "hello " + name }); 
    } 

    // needs to be authenticated 
    [HttpGet] 
    [Route("hiauthenticated")] 
    public IHttpActionResult Hello() { 
     var name = User.Identity.Name; 
     return Ok(new { message = "hello authenticated user " + name }); 
    } 
} 

Il problema è che è ancora Authenticate() chiamati MyCustomAuthenticationAttribute. Vorrei usare AllowAnonymous o qualche altro metodo per realizzare questo. Grazie per qualsiasi input.

So che posso utilizzare il mio attributo di autenticazione personalizzato a livello di azione e non a livello di controller ma ci sono casi in cui vorrei un intero controller o anche un filtro globale, quindi devo essere in grado di escludere su una singola azione o base del controller.

+0

Per riferimento ho utilizzato l'esempio sul sito asp.net [Filtri di autenticazione in ASP.NET Web API 2] (http://www.asp.net/web-api/overview/security/authentication-filters) per ottenere iniziato su questo. – Scott

risposta

8

L'implementazione di IAuthenticationFilter dovrebbe fare NIENTE se non trova un Autorizzazione regime che non riconosce.

http://www.asp.net/web-api/overview/security/authentication-filters

// 2. If there are no credentials, do nothing. 
if (authorization == null) 
{ 
    return; 
} 

// 3. If there are credentials but the filter does not recognize the 
// authentication scheme, do nothing. 
if (authorization.Scheme != "Basic") 
{ 
    return; 
} 

L'idea è che il filtro è semplicemente un modo per AUTENTICAZIONE utilizzando uno schema noto.

Sarà ancora bisogno di utilizzare il costruito nel AuthorizeAttribute e AllowAnonymousAttribute per controllare AUTORIZZAZIONE.