15

Tạo ứng dụng MVC3 và TPTB muốn chúng tôi sử dụng nhà cung cấp ủy quyền tùy chỉnh của họ. Tuy nhiên, trong quá trình phát triển nhà cung cấp auth này là một loại đau, vì nó sẽ hoặc là cung cấp cho một lỗi cho đến khi bạn tắt/khởi động lại trình duyệt, hoặc nó sẽ yêu cầu bạn phải đăng nhập o trên mỗi biên dịch.Bỏ qua hoặc tắt [Ủy quyền (Vai trò = "")] trong quá trình phát triển?

Hiện tại, tôi vừa thêm <authentication mode="None"/> vào web.config, hoạt động tốt cho đến khi tôi gặp một hành động hoặc bộ điều khiển sử dụng bộ lọc [Authorize(Roles = "Admin")] (có thể là bất kỳ vai trò nào, không chỉ Quản trị viên). Khi nó chạm vào một trong số đó, nó chỉ hiển thị một trang trống.

Có cách nào trên toàn cầu và tạm thời tắt các bộ lọc này không? Hoặc chỉ cung cấp cho người dùng tất cả các vai trò trong khi tôi đang phát triển?

EDIT

Hãy để tôi clarify- Tôi thực sự porting qua một ứng dụng lớn từ MVC2 để MVC3. Nó có rất nhiều [Authorize(Roles="Admin")][Authorize(Roles="Admin,Editor")] trong suốt nó. Tôi không muốn thay đổi tất cả những thứ đó nếu có thể.

Tôi có nên tạo một nhà cung cấp vai trò tùy chỉnh nhỏ cung cấp cho tất cả các vai trò tự động không?

+1

câu trả lời Anri là tốt hơn, vì nó không cho phép sử dụng proxy http khai thác để có được quyền admin trên máy chủ. – AgentFire

Trả lời

22

Bạn có thể viết một phong tục Ủy quyền cho bộ lọc này sẽ không thực hiện bất kỳ kiểm tra nếu các yêu cầu đến từ localhost:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext.Request.Url.IsLoopback) 
     { 
      // It was a local request => authorize the guy 
      return true; 
     } 

     return base.AuthorizeCore(httpContext); 
    } 
} 
+0

Cảm ơn, đây là những gì tôi đã làm. Tôi nhanh chóng nhận ra rằng việc tìm kiếm/thay thế thuộc tính Authorize dễ dàng hơn nhiều so với bất kỳ thứ gì khác mà tôi đang xem xét! –

+2

thay vì kiểm tra Request.IsLocal thì sao? Tôi nghĩ đó là "chống đạn" hơn. – mare

+0

Bạn nên thêm #if DEBUG xung quanh toàn bộ trả về nếu khối - nếu không bạn đang mở ra một vấn đề mất dữ liệu tiềm ẩn trong quá trình sản xuất. Có gì để ngăn chặn một quản trị bất chính đến IE trong sản xuất và gõ http://127.0.0.1/refundCC?CC=1234689&amount=infinity – stevieg

12

Bạn có thể kế thừa từ AuthorizeAttribute và ngộ riêng biệt với #if DEBUG chỉ thị.

public class MyAuthorizeAttribute: AuthorizeAttribute 
{ 
#if DEBUG 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return true; 
    } 
#endif 
} 

Hoặc #define YOUR_OWN_FLAG để bật và tắt hành vi trong mọi bản dựng, gỡ lỗi hoặc phát hành.

5

Đối với Web API:

public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext); 
    } 
} 
+0

Thử nghiệm cho Loopback là tuyệt vời haha ​​tại sao tôi không nghĩ về điều đó –

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