2009-09-10 36 views
14

Bất cứ ai biết cách thức hoạt động, tôi đang sử dụng nhà cung cấp thành viên .net và chỉ muốn lấy danh sách xml. Tôi cũng đang sử dụng .net mvc sdk. Vì vậy, đây là vấn đề khi tôi thêm [WebApiEnabled] ở phía trên của bộ điều khiển của tôi, tôi có thể kéo xml/json thành công. Nhưng khi tôi thêm [Xác thực] lên đầu bộ điều khiển của mình, tôi không thể đăng nhập. Như một ví dụ cuộn tròn -i -u "admin: vượt qua" -H "Chấp nhận: application/xml" http://localhost:xxxx/BookXác thực cơ bản còn lại với ASP.NET MVC

Cảm ơn trước sự giúp đỡ của bạn

+0

Bạn gặp lỗi? Mã trạng thái là gì? – David

Trả lời

8

được rồi vì vậy tôi figured it out nhưng giải pháp có thể là một chút ghetto. Tôi đã lấy AuthorizeAttribute từ nguồn mvc .net và mã hóa phương thức OnAutorization. Điều này chắc chắn làm việc cho tôi tuy nhiên nó chỉ hoạt động cho xác thực cơ bản và tôi không chắc chắn nếu đây là phương pháp an toàn nhất để sử dụng. Tuy nhiên nó giải quyết được vấn đề của các khách hàng web có thể truy cập các dịch vụ an toàn .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

Bạn có thể sử dụng HTTP Digest truy cập xác thực (một số chi tiết thực hiện herehere) là mạnh hơn rất nhiều so với cơ bản nhưng nó vẫn là một security trade-off. Nếu bạn cần bảo mật hơn, hãy đặt dịch vụ đằng sau SSL (nếu đó là một tùy chọn) sẽ là đủ.

8

Tôi nghĩ tôi sẽ thêm điều này ở đây cho bất kỳ ai (như tôi), những người không hoàn toàn có thể quấn đầu của họ xung quanh câu trả lời tác giả được cung cấp ở đây. Đây là bài đăng trên blog tôi vừa mô tả cách thực hiện điều này với thuộc tính [CustomBasicAuthorize] có thể được sử dụng giống như thuộc tính [Authorize] đi kèm với MVC: http://cacheandquery.com/blog/2011/03/customizing-asp-net-mvc-basic-authentication/

Các vấn đề liên quan