2009-09-10 10 views
14

Wer weiß, wie das funktioniert, ich benutze den .net-Mitgliedschaft-Anbieter und möchte nur eine XML-Liste ziehen. Ich benutze auch die .net mvc sdk. Also hier ist das Problem, wenn ich die [WebApiEnabled] an der Spitze meines Controllers hinzufügen kann ich xml/json erfolgreich ziehen. Aber wenn ich oben auf meinem Controller [Authenticate] hinzufüge, kann ich mich nicht einloggen. Als Beispiel kräuselt -i -u "admin: pass" -H "Accept: application/xml" http://localhost:xxxx/BookRestful Standardauthentifizierung mit ASP.NET MVC

Vielen Dank im Voraus für Ihre Hilfe

+0

Erhalten Sie einen Fehler? Was ist der Statuscode? – David

Antwort

8

Okay, so habe ich es, aber die Lösung kann ein bisschen Ghetto sein. Ich nahm das AuthorizeAttribute von .net mvc-Quelle und umcodierte die OnAutorization-Methode. Dies funktioniert definitiv für mich, aber es funktioniert nur für die Standardauthentifizierung und ich bin mir nicht sicher, ob dies die sicherste Methode ist. Es löst jedoch das Problem, dass Webclients auf sichere .net-mvc-Restdienste zugreifen können.

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

Sie können HTTP Digest Access-Authentifizierung verwenden (einige Implementierungsdetails here und here), die viel stärker als einfach, aber es ist immer noch ein security trade-off. Wenn Sie mehr Sicherheit benötigen, reicht es aus, den Dienst hinter SSL zu setzen (wenn es eine Option ist).

8

Ich dachte, ich würde das hier für jeden (wie mich) hinzufügen, der nicht ganz in der Lage ist, sich mit der Antwort des Autors zu beschäftigen. Hier ist ein Blogbeitrag Ich habe gerade beschrieben, wie man dies mit einem [CustomBasicAuthorize] Attribut erreicht, das auf die gleiche Weise wie das [Authorize] Attribut verwendet werden kann, das mit MVC kommt: http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/