2012-01-26 10 views
14

sau rất nhiều giải pháp và đọc một số giải pháp về cách quản lý xác thực chế độ hỗn hợp trong ứng dụng ASP.NET, tôi vẫn chưa có giải pháp phù hợp cho vấn đề của mình.Mở rộng xác thực Windows trong ứng dụng ASP.NET MVC 3

Tôi phải triển khai ứng dụng mạng nội bộ cho một nhóm người dùng khác nhau. Cho đến bây giờ tôi đã sử dụng authenthication windows rất đơn giản để thực hiện. Vấn đề của tôi nảy sinh khi nói đến việc ủy ​​quyền cho các nhóm người dùng cho các chức năng ứng dụng đặc biệt.

Sử dụng [Authorize(Users = "DOMAIN\\USER")] hoạt động tuyệt vời nhưng do tôi không có quyền truy cập vào quản lý thư mục hoạt động, tôi không thể định cấu hình quản lý theo cách tôi cần cho ứng dụng của mình.

Điều tôi muốn làm là xác định vai trò tùy chỉnh và tư cách thành viên ngoài các vai trò được xác định trong thư mục hoạt động (có thể là tiện ích mở rộng như vậy không? Ví dụ: bằng cách triển khai memberhipprovider riêng?).

Bạn nghĩ gì là giải pháp tốt nhất cho vấn đề của tôi. Tôi có thực sự phải triển khai xác thực chế độ hỗn hợp phức tạp với xác thực biểu mẫu ngoài xác thực cửa sổ không?

Technologies đã qua sử dụng:

  • MS SQL Server 2008
  • MS VS 2010
  • ASP.NET MVC 3 - Razor View Engine
  • Telerik Extensions cho ASP.NET MVC
  • IIS 7 trên Windows Server 2008

E DIT (giải pháp cuối cùng nhờ sự giúp đỡ của dougajmcdonald):

Sau khi chỉ cho tôi sử dụng triển khai IPrincipal tùy chỉnh Tôi đã tìm thấy một số giải pháp herehere. Đưa tất cả mọi thứ cùng tôi đến các giải pháp sau đây:

1.Create một thực hiện tùy chỉnh chủ yếu:

public class MyPrincipal: WindowsPrincipal 
{ 
    List<string> _roles; 

    public MyPrincipal(WindowsIdentity identity) : base(identity) { 
     // fill roles with a sample string just to test if it works 
     _roles = new List<string>{"someTestRole"}; 
     // TODO: Get roles for the identity out of a custom DB table 
    } 

    public override bool IsInRole(string role) 
    { 
     if (base.IsInRole(role) || _roles.Contains(role)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

2.Integrate tôi thực hiện chủ yếu tùy vào ứng dụng thông qua việc mở rộng "Global.asax.cs" tập tin :

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     if (Request.IsAuthenticated) 
     { 
      WindowsIdentity wi = (WindowsIdentity)HttpContext.Current.User.Identity; 
      MyPrincipal mp = new MyPrincipal(wi); 
      HttpContext.Current.User = mp; 
     } 
    } 

3.Use vai trò tùy chỉnh của tôi cho phép trong ứng dụng của tôi

public class HomeController : Controller 
{ 
    [Authorize(Roles= "someTestRole")] 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 
} 

Nó hoạt động !!! vâng!

Trả lời

8

Tôi không chắc chắn nếu điều này vẫn được áp dụng trong MVC, nhưng trong Webforms một cách để làm điều này sẽ như sau:

  1. Tạo thực hiện IPrincipal mới có lẽ kéo dài WindowsPrincipal
  2. Trong lớp này, cung cấp cho nó một tập hợp các vai trò (vai trò tùy chỉnh của riêng bạn)
  3. Điền các vai trò đó, bằng cách lấy chúng từ DB.
  4. Ghi đè IsInRole để trả về true nếu vai trò được cung cấp là EITHER đúng từ cuộc gọi cơ sở (WindowsAuthentication/Role) HOẶC từ bộ sưu tập vai trò tùy chỉnh của riêng bạn.

Bằng cách này bạn vẫn có thể móc vào Principal.IsInRole ("MyRole") và cũng là chú thích chính [PrincipalPermission()].

Hy vọng điều đó sẽ hữu ích.

EDIT trong câu trả lời cho q của:

Thực hiện lồng ghép các yếu vào sự cho phép bạn cần phải viết phương pháp của riêng bạn cho OnAuthenticate trong global.asax cho các loại chứng thực, vì vậy tôi sẽ đoán cho bạn, một cái gì đó như thế này:

void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs e) 
{ 
    // ensure we have a name and made it through authentication 
    if (e.Identity != null && e.Identity.IsAuthenticated) 
    { 
     //create your principal, pass in the identity so you know what permissions are tied to 
     MyCustomePrincipal opPrincipal = new MyCustomePrincipal(e.Identity);    
     //assign your principal to the HttpContext.Current.User, or perhaps Thread.Current 
     HttpContext.Current.User = opPrincipal;  
    } 
} 

tôi tin Authorize đứng ở vị trí một ngày sau đó đến PrincipalPermission, nhưng tôi không quá chắc chắn như khi/tại sao trong những khác biệt tôi sợ :(- xin lỗi

!
+0

tôi sẽ cung cấp cho nó một thử, cảm ơn cho phản ứng nhanh :) –

+0

oh cảm ơn bạn rất nhiều !!! Câu trả lời của bạn rất hữu ích! :-) –

+0

Không có vấn đề, vui vì nó đã giúp. Tôi đã phải làm một cái gì đó rất giống nhau rất gần đây! Trong trường hợp của tôi, tôi không muốn sử dụng các vai trò Windows Active Directory (vì các quản trị viên của chúng tôi không muốn quản lý mọi thứ theo cách đó) nhưng tôi muốn đảm bảo chúng tôi có thể sử dụng chúng nếu họ quyết định, vì vậy quyết định liên kết với IPrincipal bên cạnh những thứ thay vì chỉ tạo tài khoản người dùng như một lớp bên trong ứng dụng của chúng ta và gắn bó với vai trò của nó. – dougajmcdonald