2013-05-05 36 views
7

Tôi đang cố gắng tạo bộ điều khiển ẩn danh để đạt được xác thực mẫu. Tôi đã cấu hình IIS 7 của mình với xác thực dạng ẩn danh và hình thức bật và đặt web.config của tôi thành từ chối người dùng ẩn danh. Trên bộ điều khiển đăng nhập, tôi đặt trang trí [AllowAnonymous] trên bộ điều khiển của mình (và hành động của tôi).Xác thực và ủy quyền biểu mẫu MVC 4

Hành động duy nhất tôi có thể thực hiện trên cấu hình này là hành động đăng nhập (trả về chế độ xem "đăng nhập") và tôi đoán rằng MVC cho phép tôi thực hiện hành động này vì tôi đặt nó làm thông tin đăng nhập URL trên web.config của tôi.

Dưới đây là cấu hình cấu hình web của tôi:

 <authentication mode="Forms"> 
     <forms loginUrl="~/Login/Login" timeout="2880" /> 
    </authentication> 

Tất cả các hành động khác được chuyển hướng đến hành động đăng nhập. Trong tập hợp cấu hình này, tôi không thể đạt được các hành động quan trọng khác như khôi phục mật khẩu, đăng ký, v.v.

Tôi đang làm gì sai?

+0

Bạn không thể phủ nhận trên toàn cầu - pasword khôi phục hoặc đăng ký phải được truy cập nặc danh. –

+0

Vậy tôi cần thay đổi điều gì? Nếu tôi cho phép truy cập ẩn danh, thì tất cả trang web đều có thể truy cập được và MVC không chuyển hướng người dùng chưa được xác thực đến hành động đăng nhập. – Shahar

+0

Xem câu trả lời của tôi .. –

Trả lời

14

Sử dụng bộ lọc xác thực toàn cục với hành vi tùy chỉnh thay vì cấu hình ủy quyền trong web.config (tốt nhất cho MVC)

thêm bộ lọc toàn cầu

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

Sau đó, [AllowAnonymous] sẽ hoạt động và tất cả các bộ điều khiển và hành động khác yêu cầu cấp phép.

+0

Bạn có thể cung cấp một ví dụ không? – Shahar

+0

.. được nêu ví dụ – hVostt

+0

Cảm ơn bạn!đáng lưu ý: sau khi thêm bộ lọc tự động, bạn sẽ cần (như tôi đã làm) để cho phép truy cập nặc danh vào trang web của bạn – Shahar

0

Bạn có cố gắng cho phép uỷ quyền giấu tên cho URL của như trong ví dụ dưới đây

<location path="Login/Login"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

Tương tự như này, bạn nên thiết lập cho các ResetPassword/Restore mật khẩu/Đăng ký vv ...

+0

Trang trí không đạt được cùng một hành vi? – Shahar

1

Có hai cách tiếp cận có thể có.

Đầu tiên - bạn có thể từ chối các yêu cầu ẩn danh trên toàn cầu với thuộc tính Authorize và đánh dấu một số thuộc tính không cần ủy quyền với thuộc tính AllowAnonymous (là mới đối với MVC4).

Thứ hai - không từ chối toàn cầu mà là bảo mật các bộ điều khiển/hành động đã chọn của bạn với thuộc tính Ủy quyền.

+0

Điều này không chính xác, liên quan đến cách tiếp cận đầu tiên của bạn: nếu bạn từ chối yêu cầu ẩn danh và không thêm bộ lọc ủy quyền, bạn sẽ không thể thực hiện bất kỳ hành động nào ngoài hành động đăng nhập và thuộc tính AllowAnonymous sẽ không được xem xét bởi MVC – Shahar

+0

Tôi chưa đủ rõ ràng, việc từ chối tất nhiên phải được thực hiện với Ủy quyền. Tôi hy vọng phiên bản đã chỉnh sửa rất rõ ràng. Cảm ơn. –

11

Bạn cũng có thể đăng ký Authorize lọc trong RegisterGlobalFilters phương pháp:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 

Và sau đó sử dụng AllowAnonymous thuộc tính về phương pháp hành động đòi hỏi phải truy cập nặc danh:

[Authorize] 
public class AccountController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult RecoverPassword() 
    { 
    ... 
    } 
} 
+1

Cảm ơn, hVostt đã được 2 phút trước khi bạn – Shahar

+0

Không thành vấn đề. Vui vì bạn đã nhận được câu trả lời của bạn :) – Kamyar

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