2010-04-17 29 views
5

Tôi đang viết một trang web trong ASP.NET MVC sẽ có tài khoản người dùng. Vì trang web sẽ được định hướng theo hướng thảo luận, tôi nghĩ rằng tôi cần một hệ thống dành cho quản trị viên để có thể kiểm duyệt người dùng, giống như chúng tôi có ở đây, trên Stack Overflow. Tôi muốn có thể đưa người dùng vào "tạm ngưng", để họ có thể đăng nhập vào trang web (tại thời điểm đó họ được chào đón bằng thông báo, chẳng hạn như "Tài khoản của bạn có đã bị tạm ngưng cho đến [DATE] "), nhưng không thể thực hiện các chức năng mà người dùng thường có thể làm.Thực hiện một hệ thống treo hoặc phạt cho người dùng trong ASP.NET MVC

Cách tốt nhất để thực hiện điều này là gì?

Tôi đã nghĩ đến việc tạo vai trò "Bị tạm ngưng", nhưng vấn đề là, tôi có một vài vai trò khác nhau cho người dùng bình thường, với các đặc quyền khác nhau.

Bạn đã từng thiết kế một tính năng như thế này chưa? Tôi nên làm như thế nào? Cảm ơn trước.

+2

1 cho câu hỏi hay và có Kitteh avatar –

+0

downvote không giải thích được :( –

+0

1 cái chết để downvoters>; - | –

Trả lời

2

Hãy để tôi chuyển đổi nhận xét thành câu trả lời và hiếp dâm Zach và James trả lời để cung cấp giải pháp khả thi mà không cần phải nhập 'nhà cung cấp tùy chỉnh'. Trong khi viết các nhà cung cấp tùy chỉnh không quá phức tạp, kinh nghiệm của tôi là nếu bạn có thể xây dựng các nhà cung cấp để làm những gì bạn muốn, ngay cả khi nó đòi hỏi mùi ở đây hay ở đó, luôn luôn là con đường tốt nhất.

Thêm vai trò, giả sử WellGroomedAndBehavesSelf, điều khiển quyền truy cập vào những nội dung mà người dùng phải chu đáo và cư xử tốt nên có quyền truy cập.

Triển khai cấu hình trong web.config của bạn và thêm thuộc tính ReinstateDate (hoặc UngroundedOnDate ;-D).

Khi người dùng hoạt động không đúng, hãy xóa họ khỏi vai trò WellGroomedAndBehavesSelf và đặt thuộc tính hồ sơ ReinstateDate.

Trong logic đăng nhập của bạn, ghi đè OnAuthenticate và kiểm tra một thuộc tính hồ sơ ReinstateDate, nếu hiện tại và đã qua, hãy xóa nó và thêm người dùng vào vai trò WellGroomedAndBehavesSelf.

Xong và không cần cho nhà cung cấp tùy chỉnh.

UPDATE: Một cách tiếp cận thay thế, và có lẽ mạnh mẽ hơn ngăn chặn người dùng khỏi bị căn cứ vĩnh viễn nếu bằng cách nào đó hồ sơ cá nhân được xóa ở nơi khác hơn logic đăng nhập, là để kiểm tra vai trò WellGroomedAndBehavesSelf và nếu mất tích, sau đó kiểm tra hồ sơ cá nhân cho ReinstateDate. Nếu nó đã trôi qua hoặc không có mặt, hãy đưa người dùng trở lại vào WellGroomedAndBehavesSelf.

Hiệu ứng tương tự, nhưng thay đổi tinh vi trong logic sẽ cung cấp giải pháp mạnh mẽ hơn.

Làm thế nào để thực hiện Hình dạng: Trơn

Nếu bạn đang sử dụng một Web Site dự án tìm kiếm here.

Nếu bạn đang sử dụng Web Ứng dụng xem dự án here.

+0

Tôi nghĩ rằng tôi thực sự sẽ sử dụng giải pháp này.Bạn có thể giải thích phần mà bạn nói "Triển khai hồ sơ trong web.config của bạn và một dd một thuộc tính ReinstateDate (hoặc UngroundedOnDate ;-D) "? Tôi không thực sự chắc chắn làm thế nào để thêm một tài sản vào hồ sơ trong web.config. Cảm ơn! –

+0

@maxim - câu trả lời được cập nhật. –

+0

Cảm ơn bạn! Tôi là người mới với ASP.NET MVC: tôi tạo vai trò ở đâu? Ngoài ra, làm thế nào tôi có thể cấu hình các hồ sơ vào một bảng SQL Server? –

2

Tôi không biết mô hình đối tượng của bạn trông như thế nào, nhưng tôi giả định rằng mọi người dùng đều có thể bị tạm ngưng.

Chỉnh sửa: Tôi đã nghĩ về một giải pháp thay thế có lẽ đơn giản hơn là bạn sẽ cần phải tuần tự hóa dữ liệu ở đâu đó. Có lẽ bạn có thể sử dụng thông số DateTime thông thường trên đối tượng 'người dùng' của mình, nhưng khởi tạo nó thành DateTime.MinValue cho người dùng mới. Bất cứ khi nào bạn đặt người dùng 'tạm ngừng', hãy đặt suspendedUntil cho đến khi họ bị tạm ngưng cho đến khi.

DateTime suspendedUntil = DateTime.MinValue; 

Bất cứ khi nào bạn cần phải kiểm tra xem liệu một người dùng là ở hệ thống treo hay không, chỉ cần so sánh với suspendedUntilDateTime.Now. Nếu suspendedUntil xuất hiện sau DateTime.Now, bạn biết người dùng bị tạm ngưng cho đến ngày và giờ được chỉ định. Nếu không, người dùng không bị đình chỉ. Sau khi người dùng bị tạm ngừng, không cần phải sửa đổi suspendedUntil vì sau đó nó sẽ sau DateTime.Now.

bool userIsSuspended = suspendedUntil > DateTime.Now; 

Serializing các DateTime sẽ là một vấn đề tiết kiệm giá trị của suspendedUntil.ToBinary() và "bù nước" nó bằng cách sử DateTime.FromBinary(long).

+0

Đây là một giải pháp rất thú vị: Tôi sẽ. Hãy thử cả giải pháp của bạn và giải pháp của James Westgate vào ngày mai –

3

Tôi nghĩ rằng vai trò là cách để đi mà không cần viết nhiều mã ống nước.

Tạo vai trò được gọi là Hoạt động mà mọi người đều là thành viên theo mặc định. Sau đó, đưa người dùng ra khỏi vai trò đó trong khi họ bị tạm ngưng.

Mọi hành động bạn muốn từ chối cho người dùng bị tạm ngừng yêu cầu vai trò Hoạt động. Các mẫu.

+0

Tiếp tục: Người dùng có thể thuộc nhiều vai trò cùng một lúc, đúng không? Bằng cách đó, nếu tôi có nhiều vai trò người dùng, tất cả người dùng sẽ vẫn Hoạt động và khi bị tạm ngưng, họ ' d thiếu Hoạt động nhưng vẫn có vai trò chung của họ –

+0

Thats ý tưởng yep –

+0

Tôi sẽ thử điều đó Có vẻ như một kế hoạch khá đơn giản –

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