2009-09-10 8 views
14

Quelqu'un sait comment cela fonctionne, j'utilise le fournisseur d'appartenance .net et je veux juste tirer une liste XML. J'utilise aussi le .net mvc sdk. Donc, voici le problème lorsque j'ajoute le [WebApiEnabled] en haut de mon contrôleur, je peux tirer avec succès xml/json. Mais lorsque j'ajoute [Authentifier] en haut de mon contrôleur, je ne peux pas me connecter. A titre d'exemple pelotonner -i -u « admin: pass » H « Accepter: application/xml » http://localhost:xxxx/BookAuthentification de base reposante avec ASP.NET MVC

Merci d'avance pour votre aide

+0

Vous avez une erreur? Quel est le code d'état? – David

Répondre

8

Bon alors je me suis dehors, mais la solution peut être un ghetto bits. J'ai pris le AuthorizeAttribute de .net mvc source et recodé la méthode OnAutorization. Cela fonctionne certainement pour moi, mais cela fonctionne seulement pour l'authentification de base et je ne suis pas sûr si c'est la méthode la plus sûre à utiliser. Cependant, cela résout le problème des clients Web qui peuvent accéder à des services de repos sécurisés .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

Vous pouvez utiliser HTTP Digest d'authentification d'accès (certains détails de mise en œuvre here et here) qui est beaucoup plus fort que de base, mais il est encore un security trade-off. Si vous avez besoin de plus de sécurité en mettant le service derrière SSL (si c'est une option) serait suffisant.

8

Je pensais que j'ajouterais ceci ici pour n'importe qui (comme moi) qui n'est pas tout à fait capable d'enrouler leur tête autour de la réponse que l'auteur a fournie ici. Voici un article de blog que je viens de décrire décrivant comment accomplir ceci avec un attribut [CustomBasicAuthorize] qui peut être utilisé de la même manière que l'attribut [Authorize] fourni avec MVC: http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/

Questions connexes