2009-09-10 50 views
6

Tôi đã xây dựng hệ thống đăng nhập tùy chỉnh cho ứng dụng web asp.net mvc 1.0 của mình khi lưu trữ lượng lớn dữ liệu người dùng cho mỗi người dùng (tôi quyết định không thêm bảng tùy chỉnh cho cửa sổ xác thực do điều này). Hệ thống đăng nhập về cơ bản sử dụng SQL Server (2005 hoặc 2008) và cơ sở dữ liệu và cấu trúc bảng của riêng tôi khá chuẩn. Bảng người dùng có id, tên người dùng và mật khẩu băm duy nhất được liên kết với các bảng dữ liệu liên quan đến người dùng khác của tôi.Xác thực Windows với ASP.NET MVC

Câu hỏi của tôi là, làm thế nào tôi có thể buộc hệ thống của mình sử dụng thông tin đăng nhập Xác thực Windows. Tôi muốn cho phép quản trị viên cho một người dùng (như được định nghĩa trong hệ thống của tôi) chọn một đăng nhập Windows Authentication và có lẽ thêm một giá trị vào một cái gì đó trong bảng tùy chỉnh của tôi mà tôi có thể sử dụng để xác thực chúng?

Câu hỏi có thể bị sai lệch và có thể tôi đã hiểu sai cách Windows Authentication hoạt động nhưng tôi muốn cung cấp tùy chọn trong ứng dụng web của tôi.

+0

Tôi không biết câu trả lời chính xác nhưng: Tôi nghĩ rằng để làm việc với cửa sổ auth bạn cần phải thiết lập thư mục hoạt động và có một người dùng cho mỗi người trên mạng của bạn. Sau đó, tôi nghĩ rằng bạn cần phải mạo danh người dùng asp.net bằng cách sử dụng web.config và bạn nên được tốt để đi. – rball

Trả lời

8

Nếu bạn có Windows Auth bật trên trang web của bạn sau đó bạn sẽ có thể sử dụng để có được User.Identity.Name NT/Active Directory của họ tên người dùng của người dùng hiện đã đăng nhập và đối sánh với cột trong bảng người dùng của bạn.

+0

Vì vậy, sử dụng trong hành động của tôi HttpContext.Current.User.Identity.Name tôi có thể truy cập tên người dùng của tôi (MACHINE \ PHIL) và IsAuthenticated được thiết lập. Vì vậy, tất cả những gì tôi cần làm là thêm một cột khác vào bảng người dùng của tôi để liên kết tên người dùng của tôi với User.IDentity.Name và kiểm tra xem họ có được Xác thực không? – Phil

+1

Nếu User.Identity.Name trả về một giá trị mà chúng ĐƯỢC xác thực. Và nhiều hơn nữa đến mức họ sẽ không thể truy cập trang trừ khi chúng được xác thực (IIS sẽ buộc họ tự động xác nhận trước khi nó sẽ hiển thị trang). – Scrappydog

1

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn thêm một số dữ liệu khác được liên kết với tên người dùng Windows Authenticated?

Nếu vậy, bạn sẽ cần lưu trữ tên người dùng và thông tin tùy chỉnh này trong bảng mới. Dữ liệu xác thực cửa sổ tồn tại trong Active Directory để bạn có thể xem ở đó để có danh sách người dùng. Bạn sẽ không nhận được bất kỳ thông tin tùy chỉnh nào được thêm vào AD tự động khi Windows xác thực người dùng. Nếu bạn muốn có bất kỳ thông tin tùy chỉnh nào, bạn sẽ cần thêm một tra cứu tùy chỉnh vào AD cho nó hoặc chỉ tra cứu dữ liệu tùy chỉnh của bạn trong cơ sở dữ liệu của bạn tùy thuộc vào nơi bạn quyết định lưu trữ thông tin.

Khá nhiều bạn nhận được với Xác thực Windows là tên người dùng của người dùng và khả năng kiểm tra vai trò (nhóm quảng cáo) được liên kết với người dùng đó. Bất cứ điều gì ngoài đó bạn sẽ cần phải tự mã hóa.

Gần đây tôi đã hỏi về việc triển khai tùy chỉnh ngoài bảo mật tích hợp trong MVC và đã tự mình đưa ra giải pháp. Có thể có một số mẩu tin có thể giúp bạn trả lời câu hỏi của bạn:

How to implement authorization checks in ASP.NET MVC based on Session data?

+0

Nhận xét hữu ích, đọc một số nền tảng tốt đẹp và các ý tưởng khác. – Phil

8

Đây là cách chúng tôi đã làm nó cho một hình thức/cửa sổ ứng dụng xác thực lai: -

public class MyBaseController 
{ 
    protected override void OnAuthorization(AuthorizationContext authContext) 
    { 
    if 
    (
     !User.Identity.IsAuthenticated && 
     Request.LogonUserIdentity != null && 
     Request.LogonUserIdentity.IsAuthenticated 
    ) 
    { 
     String logonUserIdentity = Request.LogonUserIdentity.Name; 
     if (!String.IsNullOrEmpty(logonUserIdentity)) 
     { 
     User loginUser = 
      Context.Users.FirstOrDefault(
      x => x.UserIdentity == logonUserIdentity); 
     if (loginUser != null) 
      FormsAuthentication.SetAuthCookie(
      loginUser.LoginName,createPersistentCookie); 
    } 
    } 

Có một số đóng gói mà tôi đã đưa ra vì lợi ích của chặt.

+0

Cảm ơn đoạn mã hữu ích! :) – Phil

+0

Iain, bạn có phiền khi đăng nhiều mã hơn không?Tôi quan tâm đến việc đóng gói đúng chức năng này VÀ cách bạn đã cấu hình IIS (tôi đang sử dụng IIS 7 bản thân mình). Cảm ơn. – wgpubs

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