2012-04-27 33 views
12

Tại mạng công ty của chúng tôi, các vai trò trong Active Directory (AD) không được gán cho ứng dụng của tôi một cách thích hợp. Vì vậy, tôi đã tạo ra một bảng đơn giản trong cơ sở dữ liệu của tôi ánh xạ tất cả người dùng trong AD và vai trò của họ. Có nghĩa đen chỉ có hai cột trong bảng này, người dùng và vai trò.Vai trò tùy chỉnh đơn giản cho xác thực cửa sổ trong asp. mạng lưới?

Tôi hy vọng sẽ tận dụng lợi thế của việc quản lý vai trò mạnh mẽ trong asp.net, tôi muốn sử dụng các tính năng như [Authorize(Roles = "Managers")]. có cách nào đơn giản để sử dụng các vai trò tùy chỉnh này mà không cần thiết lập vai trò phức tạp và nhà cung cấp thành viên không?

ứng dụng nền: sql server, LINQ, asp.net MVC

Trả lời

11

Nó là rất dễ dàng để thực hiện cung cấp dịch vụ vai trò tùy chỉnh. Về cơ bản bạn sẽ cần phải thực hiện hai chức năng.

Nhìn vào bài viết: Custom Role Provider for MVC

+0

chính xác những gì tôi cần, cảm ơn! – Bonk

+7

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Fedor

2

Article provided in the event the website goes down.

Tuỳ chỉnh Provider Role cho MVC

Trong một bài viết trước, tôi giải thích làm thế nào để tạo Provider Tuỳ viên ủy quyền cho người sử dụng và bảo vệ điều khiển và các trang. Nhưng nếu bạn muốn hiển thị hoặc bảo vệ một số khu vực, bộ điều khiển hoặc trang cho một nhóm người dùng cụ thể thì sao? Ví dụ: chỉ cho phép truy cập vào Bảng điều khiển dành cho quản trị viên.

Trong .Net Framework cho mục đích này là Nhà cung cấp vai trò. Nhưng một lần nữa, nó sử dụng DB riêng cho vai trò người dùng cửa hàng. Vì vậy, hãy tạo và cấu hình Nhà cung cấp vai trò tùy chỉnh sẽ sử dụng DB của chúng tôi hoặc bất kỳ bộ nhớ nào khác. Như trước đây chúng ta nên ghi đè lên lớp từ NET:

enter image description here

enter image description here

enter image description here

Đối với chức năng tối thiểu, chúng ta không cần thực hiện và ghi đè lên hai chức năng GetRolesForUser và IsUserInRole. Đầu tiên, người ta được sử dụng để có được một danh sách của tất cả các vai trò người dùng (hoặc nhóm):

public override string[] GetRolesForUser(string username) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (roles != null) 
      return roles.ToArray(); 
     else 
      return new string[] {}; ; 
    } 
} 

Như bạn có thể thấy tôi xác định vị trí người dùng trong DB của tôi bằng cách tham số tên người dùng của chức năng (trong trường hợp của tôi nó có thể là tên người dùng hoặc email) và tạo danh sách chuỗi vai trò người dùng.

chức năng thứ hai là để kiểm tra xem người dùng trong vai trò (hoặc nhóm):

public override bool IsUserInRole(string username, string roleName) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (user != null) 
      return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
     else 
      return false; 
    } 
} 

Sau đó, chúng ta cần phải cấu hình trong dung file web.config để sử dụng nhà cung cấp vai trò tạo ra. Có thể cần phải đặt cacheRolesInCookie thành sai cho mục đích gỡ lỗi hoặc hành vi sẽ không thể đoán trước.

<system.web> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <httpRuntime targetFramework="4.5.2" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true"> 
     <providers> 
      <clear /> 
      <add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" /> 
     </providers> 
    </roleManager> 
</system.web> 

Bây giờ bạn có thể bảo vệ điều khiển, hành động, các trang cho một nhóm cụ thể của người sử dụng mà là trong vai trò xác định bởi bộ Ủy quyền cho thuộc tính:

using System; 
using System.Web.Mvc; 

namespace Kitsula.Areas.Admin.Controllers 
{ 
    [Authorize(Roles = "Administrators")] 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Admin/Home/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

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