2009-01-03 31 views

Trả lời

25

Hoặc tôi nên sử dụng kiểm tra các vai trò trên trang Veiw tự của nó chứ không phải là trên hành động, nếu như vậy có thể một người nào đó plz cho tôi làm thế nào để kiểm tra xem trên xem trang

Bạn cần phải làm tất cả. Kiểm tra vai trò trên các hành động như một biện pháp bảo mật và kiểm tra vai trò trên các chế độ xem để bật/tắt các điều khiển cụ thể.

Trong trang điểm của bạn dưới dạng dài kiểm tra vai trò là

HttpContext.Current.User.IsInRole("Administrator") 

nhiều nhà phát triển sẽ tạo ra phương pháp trang helper để bạn có thể kết thúc với một cái gì đó ngắn gọn hơn cho các ứng dụng của bạn như

public static bool IsAdmin(this ViewUserControl pg) 
{ 
    return pg.Page.User.IsInRole("Administrator") 
} 

sau đó trong chế độ xem của bạn, bạn chỉ có thể sử dụng this.IsAdmin()

Để giữ cho chế độ xem của bạn lộn xộn xem xét việc sử dụng một phần lượt xem

<% if (IsAdmin()) 
    { 
     Html.RenderPartial("AdminPanel"); 
    } 
    else 
    { 
     Html.RenderPartial("UserPanel"); 
    } 
%> 
+0

tôi đã làm như vậy nhưng tôi không thể tìm thấy IsAdmin trong quan điểm của bộ điều khiển .. tại sao nó lại như vậy ?? – Neel

+0

Đó là phương pháp trợ giúp bạn tự thêm. –

+0

Hoặc Có thể Yo đã quên câu lệnh 'static' trong khai báo hàm! – Moslem7026

2

mà không nghiên cứu các cơ chế chính xác asp.net MVC sử dụng cho vai trò tôi sẽ hét lên không cho đặt bất kỳ logic kinh doanh của bạn trong giao diện đó là những gì bạn đang làm vai trò nếu bạn đang kiểm tra trong giao diện

+0

Nói chung tôi đồng ý với điều này, nhưng tôi không quá can thiệp đến mức tôi sẽ nhấn mạnh vào việc tạo ra một cái nhìn hoàn toàn khác để thay đổi thêm/xóa một yếu tố cụ thể dựa trên vai trò của người dùng. – tvanfosson

0

tôi m không quen thuộc với ASP.NET MVC (chưa) nhưng bạn không thể làm một số loại bộ lọc có điều kiện trong View? Nếu Bộ điều khiển truyền vai trò cho Chế độ xem, thì bạn sẽ có thể thực hiện bộ lọc có điều kiện và hiển thị một khối mã nhất định nếu người dùng là quản trị viên. Nếu bạn muốn hiển thị một trang hoàn toàn riêng biệt, thì bạn sẽ có nhiều Chế độ xem, nếu không bạn có thể sử dụng một trang và thực hiện một số điều kiện.

Trong Ruby on Rails nó sẽ là một cái gì đó tương tự (xin lỗi, tôi không biết ASP.NET MVC thực sự chưa):

<% if @user.admin? # is the user an admin %> 
    <h3>Admin Tools</h3> 
<% end %> 
<p>Regular site content</p> 

Trong Rails bạn sẽ nạp thêm nội dung từ partials; ASP.NET MVC có một cái gì đó tương tự nhưng tôi quên những gì nó được gọi là. Có thể nhìn vào đó?

Xin lỗi tôi không thể trợ giúp thêm - như tôi đã nói tôi chưa thực sự chơi với ASP.NET MVC.

3

Nếu bạn đang sử dụng MVC, toàn bộ điểm phát triển là giữ logic ra khỏi khung nhìn và trong bộ điều khiển. Dường như với tôi như bạn muốn được tốt hơn off trên một ca khúc phát triển WebForms hơn một ca khúc MVC.

Tất cả những gì đang được nói, tôi làm một kiểm tra quản lý trên rất nhiều các trang của tôi bằng cách sử dụng một tấm séc như thế này:

<% if ((bool)ViewData["Admin"]) { %> 
    <!-- Show admin controls here --> 
<% } %> 

Nhưng nếu bạn đang cố gắng xây dựng logic thực tế vào View thì bạn cần phải tìm ra những gì bạn có thể đẩy trở lại bộ điều khiển để thực hiện công việc và có chế độ xem càng câm càng tốt, tác động lên cờ được gửi tới nó.

5

Nếu màn hình thay đổi dựa trên vai trò - và thay đổi nhỏ - khi đó tôi sẽ thực hiện kiểm tra trong chế độ xem. Nếu một số chế độ xem bị hạn chế dựa trên vai trò, thì tôi sẽ thực hiện kiểm tra trong bộ điều khiển. Nếu lượt xem hoàn toàn khác (điều này sẽ khó tưởng tượng), thì lượt xem riêng biệt cho mỗi vai trò có thể phù hợp.

Bạn có thể muốn trừu tượng hóa một số thành phần xem vai trò cụ thể thành chế độ xem một phần để đơn giản hóa logic chế độ xem của bạn - về cơ bản bạn chỉ phải kiểm tra để bao gồm một phần hoặc không dựa trên vai trò.

Ngoài ra, ngoài việc kiểm tra "IsAuthenticated", tôi sẽ di chuyển lôgic kiểm tra vai trò đến bộ điều khiển và truyền (dưới dạng dữ liệu) để xem thông tin về yếu tố bao gồm/loại trừ dựa trên vai trò. Điều này giúp cho logic kinh doanh thực tế không bị chảy máu vào chế độ xem của bạn.

+0

Trong dự án của tôi, tôi cần duy trì thông tin chi nhánh. Quản trị viên hệ thống sẽ có thể xem/duy trì tất cả thông tin chi nhánh. Quản trị viên chi nhánh chỉ nên xem/duy trì thông tin chi nhánh của riêng họ. Hai quan điểm riêng biệt tôi nghĩ. –

2

Vâng, điều đó khiến tôi bận tâm ... nhưng đồng thời có vẻ vô lý khi tải toàn bộ chế độ xem khác nhau cho một thay đổi nhỏ như vậy.

btw làm thế nào bạn thiết lập này trong điều khiển của bạn. Ngay bây giờ, điều khiển của tôi trông giống như mã dưới đây, mà tôi không nghĩ là đúng.

[Authorize(Roles = "Admin, Member")] 
public ActionResult RegistrationInformation() 
{ 

    return View(); 
} 
+0

Điều đó là đúng nhưng tôi dự định triển khai lớp ủy quyền tùy chỉnh để chứng minh các vai trò được liệt kê như Roles.Admin | Roles.Member. Bằng cách đó tôi nhận được kiểm tra thời gian biên dịch nếu một vai trò vẫn còn tồn tại. –

0

Tôi có mô hình cơ sở từ tất cả các mẫu khác mở rộng. Trong mô hình này tôi đã tải vai trò của người dùng. Nó dựa trên phương thức httpcontext.user.isinrole(). Tất cả các chế độ xem được đánh máy mạnh đều mong đợi loại mô hình cơ sở. Vì vậy, tôi luôn luôn có thể kiểm tra trong tất cả các quan điểm cái gì đó như Model.CurrentUser.IsInRoles (Role1 | Role2). Không chỉ trong quan điểm của khóa học, nhưng trong ứng dụng lỗ.

0

Tôi muốn có toàn quyền kiểm soát này trong giao diện, và tôi thấy rằng:

<% if (User.IsInRole("Super User")) { %> 
    <h1>Hello world!</h1> 
<% } %> 

trình cho hầu hết các tình huống. Nó cũng cho phép bạn dễ dàng định dạng có điều kiện cho các vai trò khác, ví dụ: "Trình quản lý nội dung", "Đã đăng ký", v.v.

Tôi thích câu trả lời của Todd Smith, vì bạn có thể thay đổi tên vai trò Quản trị viên chỉ yêu cầu một thay đổi, trong khi, nếu bạn đặt chuỗi "Siêu người dùng" hoặc "Quản trị viên" trực tiếp trong chế độ xem, bạn sẽ phải thay đổi nó bất cứ nơi nào bạn đã sử dụng giá trị.

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