2009-09-10 27 views
14

Chiunque sa come funziona, sto utilizzando il provider di appartenenza .net e voglio solo estrarre un elenco xml. Sto anche usando il .net mvc sdk. Quindi, ecco il problema quando aggiungo [WebApiEnabled] nella parte superiore del mio controller, posso estrarre xml/json con successo. Ma quando aggiungo [Autentica] nella parte superiore del mio controller non riesco ad accedere. A titolo di esempio arricciare -i -u "admin: pass" -H "Accept: application/xml" http://localhost:xxxx/BookAutenticazione base restful con ASP.NET MVC

Grazie in anticipo per il vostro aiuto

+0

Hai ricevuto un errore? Qual è il codice di stato? – David

risposta

8

Va bene così ho pensato che fuori, ma la soluzione può essere un po 'ghetto. Ho preso l'AuthorizeAttribute da .net mvc source e ho ricodificato il metodo OnAutorization. Questo sicuramente funziona per me, ma funziona solo per l'autenticazione di base e non sono sicuro se questo è il metodo più sicuro da usare. Tuttavia, risolve il problema dei client Web che possono accedere a servizi di sicurezza .net mc sicuri.

public virtual void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 


     string auth = filterContext.HttpContext.Request.Headers["authorization"]; 

     if (!String.IsNullOrEmpty(auth)) 
     { 
      byte[] encodedDataAsBytes = Convert.FromBase64String(auth.Replace("Basic ", "")); 
      string val = Encoding.ASCII.GetString(encodedDataAsBytes); 
      string userpass = val; 
      string user = userpass.Substring(0, userpass.IndexOf(':')); 
      string pass = userpass.Substring(userpass.IndexOf(':') + 1); 

      if (!System.Web.Security.Membership.Provider.ValidateUser(user, pass)) 
      { 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 

     } 
     else 
     { 
      if (AuthorizeCore(filterContext.HttpContext)) 
      { 


       HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache; 
       cachePolicy.SetProxyMaxAge(new TimeSpan(0)); 
       cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */); 
      } 
      else 
      { 
       // auth failed, redirect to login page 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 


    } 
2

È possibile utilizzare HTTP Digest Authentication Access (alcuni dettagli di implementazione here e here) che è molto più forte di base, ma è ancora un security trade-off. Se hai bisogno di più sicurezza mettere il servizio dietro SSL (se è un'opzione) sarebbe sufficiente.

Problemi correlati