2009-09-10 20 views
14

Cualquiera sabe cómo funciona esto, estoy usando el proveedor de membresía .net y solo quiero extraer una lista xml. También estoy usando .net mvc sdk. Así que aquí está el problema cuando agrego [WebApiEnabled] en la parte superior de mi controlador y puedo extraer xml/json. Pero cuando agrego [Autenticar] a la parte superior de mi controlador no puedo iniciar sesión. A modo de ejemplo rizar -i -u "admin: pase" -H "Accept: application/xml" http://localhost:xxxx/BookAutenticación básica de reposo con ASP.NET MVC

Gracias de antemano por su ayuda

+0

¿Aparece un error? ¿Cuál es el código de estado? – David

Respuesta

8

Muy bien, así que lo descubrió, pero la solución puede ser un gueto bits. Tomé AuthorizeAttribute de .net mvc source y grabé el método OnAutorization. Esto definitivamente funciona para mí, sin embargo, solo funciona para la autenticación básica y no estoy seguro de si este es el método más seguro de usar. Sin embargo, resuelve el problema de los clientes de la web que pueden acceder a los servicios seguros de descanso de .net mvc.

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

Puede utilizar HTTP Digest autenticación de acceso (algunos detalles de implementación y herehere), que es mucho más fuerte que lo básico pero sigue siendo un security trade-off. Si necesita más seguridad, poner el servicio detrás de SSL (si es una opción) sería suficiente.

Cuestiones relacionadas