2012-03-06 20 views
38

Tôi có thuộc tính ủy quyền trên bộ điều khiển, nhưng tôi muốn tắt tính năng này trên một hành động. Tôi đã tạo bộ lọc ủy quyền của riêng mình và thêm "Ẩn danh" vào danh sách Vai trò. Trong bộ lọc của tôi, tôi trả về true nếu Anonymous xuất hiện trong danh sách vai trò.Có thể vô hiệu hóa ủy quyền trên một hành động trong bộ điều khiển MVC không?

Tuy nhiên, dường như không vượt qua trang đăng nhập như thể ủy quyền điều khiển đang làm trống trước bất kỳ điều gì khác.

+0

'(1):' Không chắc tôi hiểu bạn, một số mã sẽ tốt. '(2):' Bạn có thể thêm các thuộc tính ủy quyền trên các phương thức hành động. – gideon

+0

Bạn có thể tạo phiên bản Thuộc tính của riêng mình. http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3

+0

Gee, mọi người dường như không hiểu bạn :). Tôi hiểu, nhưng tôi muốn có một giải pháp vì tôi có cùng một vấn đề. Bạn đã tìm thấy một cái gì đó trong thời gian chờ đợi? –

Trả lời

69

Bạn có thể thêm [Authorize] vào lớp bộ điều khiển, sau đó thêm [AllowAnonymous] vào hành động đơn lẻ mà bạn không muốn được ủy quyền. Ví dụ:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

Điều này chỉ hoạt động trên MVC4 trở lên, nhưng nó hoạt động hoàn hảo – Nathan

-3

Không thêm AuthorizationAttribute vào phương thức hành động của bạn, nơi bạn chưa bao giờ yêu cầu.

thuộc tính tùy chỉnh của tôi

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

điều khiển của tôi

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

Tôi hy vọng bạn có quan điểm của tôi là những gì tôi đang cố gắng để nói rằng bạn.

================= Câu trả lời được cập nhật ========================== ===================== Tạo một thuộc tính khác như dưới đây.

public sealed class AnonymousAttribute : Attribute { } 

Vui lòng đặt mã bên dưới vào phương thức OnAuthorization của bạn.

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

Ok nhưng điều đó có nghĩa là thêm bộ lọc trên tất cả các hành động của bộ điều khiển. Tôi thích ý tưởng giữ bộ lọc ủy quyền ở trên cùng và sau đó vô hiệu hóa nơi tôi cần. Có vẻ mạnh mẽ hơn/an toàn theo cách này. – jaffa

+0

Đúng vậy. Hãy cho tôi biết rằng, nó có hiệu quả cho bạn hay không? Nếu nó là hơn hãy đánh dấu nó như một câu trả lời, để nó sẽ hữu ích cho người khác. –

+0

Nó hoạt động để có được ủy quyền trên chỉ những hành động bạn muốn, nhưng nó không phải là câu hỏi của OP. – Kyle

3

Bạn có thể tạo phiên bản thuộc tính của riêng mình.

Có một câu hỏi rất giống nhau và có một câu trả lời khá hay về cách triển khai thuộc tính của riêng bạn xử lý tình huống này.

Override Authorize Attribute in ASP.NET MVC

Btw. bạn cũng có thể tạo bộ điều khiển của mình có quyền được cấp phép theo mặc định.

cơ sở

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

Cách sử dụng

public class MyController : SecureControllerBase 
{ 
} 
+0

Cảm ơn, nhưng nói rằng tôi có một bộ điều khiển với 10 phương pháp hành động yêu cầu ủy quyền và chỉ có 1 hành động không có. Bộ điều khiển của tôi đã bật ủy quyền trên tất cả các hành động (bằng cách có bộ lọc ủy quyền ở đầu định nghĩa bộ điều khiển), tuy nhiên tôi chỉ muốn tắt nó trên một phương thức hành động. – jaffa

+0

Nếu bạn thêm [OptionalAuthorize] vào bộ điều khiển và sau đó [OptionalAuthorize (false)] trên đầu của hành động? Điều đó có hiệu quả với bạn không? – Tx3

0

Chỉ cần thêm thuộc tính đến Actions bạn muốn lọc, chứ không phải trên lớp điều khiển. Bằng cách không trang trí các hành động, chúng sẽ không được lọc, miễn là bộ điều khiển hoặc một trong các bộ điều khiển cơ sở của nó không có thuộc tính.

+2

Tôi muốn ngoại lệ cho quy tắc, vì vậy hãy bật bộ điều khiển và tắt cho một thao tác. – jaffa

1

Tôi vừa làm một giải pháp sử dụng Azure ACS làm Nhà cung cấp nhận dạng liên kết và câu trả lời được chấp nhận không hoạt động đối với tôi. Đối với những người đang đấu tranh, giải pháp của tôi là bỏ qua bảo mật hoàn toàn cho bộ điều khiển/lượt xem được yêu cầu.

Tạo Bộ điều khiển/Chế độ xem mới cho những hành động bạn cần bỏ qua ủy quyền.

Và trên web.config thêm thông tin sau,

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
Các vấn đề liên quan