2013-03-01 39 views
27

sự hiểu biết của tôi về ASP.NET MVC là cho phép tôi nên sử dụng một cái gì đó giống như -phép Tuỳ chỉnh trong Web.API

public class IPAuthorize : AuthorizeAttribute { 

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    //figure out if the ip is authorized 
    //and return true or false 
} 

Nhưng trong Web API, không có AuthorizeCore(..).

OnAuthorization(..) và lời khuyên chung cho MVC không được sử dụng OnAuthorization(..).

Tôi nên sử dụng thông tin gì để ủy quyền tùy chỉnh trong API Web?

Trả lời

43

Tôi không đồng ý với đối lập ở tất cả -

Authorization được thực hiện trong một bộ lọc cho phép - đó có nghĩa là bạn có nguồn gốc từ System.Web.Http.AuthorizeAttribute và thực hiện các phương pháp IsAuthorized.

Bạn không triển khai ủy quyền trong bộ lọc hành động thông thường vì chúng chạy sau trong đường dẫn hơn bộ lọc ủy quyền.

Bạn cũng không triển khai xác thực trong bộ lọc (như phân tích cú pháp JWT) - việc này được thực hiện thậm chí sớm hơn trong một điểm có thể mở rộng được gọi là MessageHandler.

+2

+1 Đây là câu trả lời đúng sử dụng System.Web.Http.AuthorizeAttribute. Lý do duy nhất cho việc sử dụng một hành động ủy quyền một cách miễn cưỡng là nếu bạn cần truy cập vào nội dung thư được deserialised để đưa ra quyết định cho phép nhưng điều này hiếm khi cần thiết hoặc thực hành tốt. –

+0

Nếu tôi thực hiện ủy quyền địa chỉ ip kế thừa từ AuthorizeAttribute, có ok không khi ghi đè lên OnAuthorization (..) - Tôi đã đọc trong MVC mà bạn khuyên không nên. – tom

+1

Thay vì ghi đè OnAuthorization, có lẽ tốt hơn là ghi đè IsAuthorized và/hoặc HandleUnauthorizedRequest. Chúng làm hầu hết công việc thực tế. –

11

Phương pháp chúng tôi sử dụng là thuộc tính ApiAuthorize tùy chỉnh kế thừa từ System.Web.Http.AuthorizeAttribute. ví dụ:

public class ApiAuthorizeAttribute : AuthorizeAttribute 
{ 
    readonly CreditPointModelContext _ctx = new CreditPointModelContext(); 

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if(Authorize(actionContext)) 
     { 
      return; 
     } 
     HandleUnauthorizedRequest(actionContext); 
    } 

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
     challengeMessage.Headers.Add("WWW-Authenticate", "Basic"); 
     throw new HttpResponseException(challengeMessage); 

    } 

    private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     try 
     { 
      //boolean logic to determine if you are authorized. 
      //We check for a valid token in the request header or cookie. 


     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 
} 
+9

Bạn không nên ghi đè OnAuthorization - vì bạn sẽ bị thiếu [AllowAnonymous] xử lý. – leastprivilege

+4

Tôi nghĩ lý do bạn cho phép ở nơi đầu tiên là không cho phép ẩn danh. Hãy gọi tôi là điên, nhưng điều đó không có ý nghĩa gì cả. –

+1

Làm cho tinh thần, tuy nhiên, tôi không thể nghĩ ra nhiều lý do tại sao bạn muốn cho phép truy cập Anonymous vào API của bạn. Trong trường hợp của chúng tôi, chúng tôi chắc chắn không muốn bất kỳ ai nhận dữ liệu từ API của chúng tôi mà không có mã thông báo xác thực hợp lệ. –