2010-10-26 35 views
18

Làm thế nào tôi có thể thực hiện sau đây trong ứng dụng ASP.NET MVC:Làm thế nào để hỗ trợ NTLM xác thực với mùa thu trở lại để hình thành trong ASP.NET MVC?

  1. dùng mở trang web mạng nội bộ
  2. dùng sẽ được âm thầm chứng thực nếu có thể
  3. nếu NTLM xác thực không làm việc ra, hình thức chương trình đăng nhập để sử dụng
  4. sử dụng là dấu hiệu của mật khẩu đăng nhập và chọn tên miền từ danh sách các lĩnh vực được xác định trước
  5. người dùng được xác thực trong mã sử dụng AD

Tôi biết cách triển khai 4 và 5 nhưng không thể tìm thấy thông tin về cách kết hợp NTLM và biểu mẫu. Để hộp thoại đăng nhập/mật khẩu gốc NTLM không bao giờ được hiển thị - xác thực trong suốt hoặc trang đăng nhập đẹp.

Cách hoạt động? Người dùng có nên được yêu cầu đăng nhập và mật khẩu không? Thông tin đăng nhập hiện tại của cô (tên người dùng tên miền) có được sử dụng mà không yêu cầu nhập thông tin đăng nhập và mật khẩu không?

CẬP NHẬT cho các, điều tra cùng một vấn đề:

Khi tôi hỏi này tôi đã không hoàn toàn hiểu làm thế nào xác thực NTLM làm việc trong nội bộ. Điều quan trọng ở đây cần hiểu là nếu trình duyệt của người dùng không hỗ trợ NTLM đúng cách hoặc nếu hỗ trợ NTLM bị vô hiệu hóa bởi người dùng - máy chủ sẽ không bao giờ có cơ hội để giải quyết vấn đề này.

Làm thế nào Windows xác thực đang làm việc:

  1. Khách hàng gửi một yêu cầu HTTP thông thường đến máy chủ
  2. Server đáp ứng với trạng thái HTTP 401 và dấu hiệu cho thấy NTLM xác thực phải được sử dụng để truy cập tài nguyên
  3. Khách hàng gửi NTLM Tin nhắn loại1
  4. Máy chủ phản hồi với thông báo NTLM Type2 với thử thách
  5. Khách hàng gửi tin nhắn Type3 với phản hồi thách thức
  6. Server đáp ứng với nội dung thực tế yêu cầu

Như bạn thấy, trình duyệt không hỗ trợ NTLM sẽ không đi đến bước (3), IIS thay vì người dùng sẽ được hiển thị tạo Lỗi 401 trang.

Nếu người dùng không có bằng chứng xác thực, sau khi hủy trình duyệt cửa sổ bật lên xác thực NTLM sẽ không tiếp tục (3).

Vì vậy, chúng tôi không có cơ hội tự động chuyển hướng người dùng đến trang đăng nhập tùy chỉnh.

Tùy chọn duy nhất ở đây là có trang "cổng" nơi chúng tôi quyết định xem người dùng có nên hỗ trợ NTLM hay không và nếu có, hãy chuyển hướng đến trang chủ được bảo vệ NTLM.

Và nếu không, hãy hiển thị biểu mẫu đăng nhập và cho phép xác thực bằng cách nhập thông tin đăng nhập và mật khẩu theo cách thủ công.

Quyết định thường được thực hiện dựa trên địa chỉ IP của người dùng và/hoặc tên máy chủ bằng cách khớp các dải IP hoặc bằng cách kiểm tra các bảng IP được xác định trước.

+0

http: // stackoverflow. com/questions/492977/anonymous-access-and-ntlm-authentication-in-iis –

Trả lời

8

Bài viết này có thể giúp bạn chỉ đúng hướng. Về cơ bản bạn có hai ứng dụng trong hai thư mục ảo dưới cùng một tên máy chủ. Một ứng dụng sử dụng Xác thực mẫu, một ứng dụng sử dụng Windows. Việc sử dụng xác thực Windows tạo một cookie xác thực biểu mẫu hợp lệ và chuyển hướng đến thư mục ảo thứ hai.

ASP.NET Mixed Mode Authentication

0

Bạn không thể có cả hai NTLM và FormsAuthentication trong ứng dụng ASP.NET cùng. Bạn sẽ cần hai ứng dụng khác nhau trong các thư mục ảo riêng biệt.

+6

Không hoàn toàn đúng - bạn không thể cấu hình (sử dụng web.config) một ứng dụng để hỗ trợ cả xác thực NTLM và Forms, nhưng không có lý do tại sao bạn không thể không tạo ra một mô-đun xác thực tùy chỉnh để xử lý nó. – Keith

2

Tôi có thiết lập chính xác trong quá trình sản xuất, tôi thiết lập cổng của mình để sử dụng FormsAuth và đã viết một chức năng giúp IP của khách truy cập tra cứu tài khoản người dùng đã đăng nhập vào IP/PC đó. Sử dụng tên tôi tìm thấy (ví dụ: DOMAIN\user), tôi xác minh miền khớp với miền của tôi và tên/tài khoản người dùng hợp lệ trong nhà cung cấp FormsAth của tôi bằng cách sử dụng Membership.GetUser(<user>). Nếu cuộc gọi này trả về kết quả trùng khớp và người dùng IsApproved Tôi tạo một cookie FormsAuthenticationTicket & cho người dùng. Tôi có hơn 400 người trên mạng và điều này hoạt động hoàn hảo, các máy tính duy nhất vẫn đăng nhập là (1. Người dùng không có tài khoản trong cổng của tôi, 2. Một vài người dùng MAC/Linux, 3. Người dùng di động không khởi động trên mạng và đã có Group Policy cho phép Firewall của họ lên Cao).

Việc nắm bắt để giải pháp này là nó đòi hỏi mạo danh một tài khoản quản trị miền để truy vấn những người sử dụng máy tính, và rằng bạn sử dụng mã unmanaged netapi32.dll.

Đây là mã tôi sử dụng (các cuộc gọi hàm bên ngoài không được cung cấp, cho ngắn gọn). Tôi đã cố gắng để đơn giản hóa điều này một chút, kể từ khi có LOTS của các cuộc gọi bên ngoài.

string account = String.Empty; 
string domain = String.Empty; 
string user = String.Empty; 


ImpersonateUser iu = new ImpersonateUser(); //Helper that Enabled Impersonation 
if (iu.impersonateValidUser(StringHelper.GetAppSetting("DomainAccount"), StringHelper.GetAppSetting("DomainName"), StringHelper.GetEncryptedAppSetting("DomainAccountPassword"))) 
{ 
    NetWorkstationUserEnum nws = new NetWorkstationUserEnum(); //Wrapper for netapi32.dll (Tested on Vista, XP, Win2K, Win2K3, Win2K8) 
    string host = nws.DNSLookup(Request.UserHostAddress); // netapi32.dll requires a host name, not an IP address 

    string[] users = nws.ScanHost(host); // Gets the users/accounts logged in 

    if (nws.ScanHost(host).Length > 0) 
    { 
     string workstationaccount = string.Empty; 

     if (host.IndexOf('.') == -1) // Pick which account to use, I have 99.9% success with this logic (only time doesn't work is when you run a interactive process as a admin e.g. Run As <process>). 
     { 
      workstationaccount = String.Format("{0}\\{1}$",StringHelper.GetAppSetting("DomainName"), host).ToUpper(); 
     } 
     else 
     { 
      workstationaccount = String.Format("{0}\\{1}$", StringHelper.GetAppSetting("DomainName"), host.Substring(0, host.IndexOf('.'))).ToUpperInvariant(); 
     } 

     account = users[users.Length - 1].Equals(workstationaccount) ? users[0] : users[users.Length - 1]; 

     domain = account.Substring(0, account.IndexOf("\\")); 
     user = account.Substring(account.IndexOf("\\") + 1, 
           account.Length - account.IndexOf("\\") - 1); 
    } 

    iu.undoImpersonation(); // Disable Impersonation 
} 

Bây giờ, bằng cách sử dụng tài khoản chúng tôi nắm lấy trong chức năng/quy trình đầu tiên, chúng tôi cố gắng xác minh xem có nên đăng nhập hay tự động đăng nhập người dùng không.

MembershipUser membershipUser = Membership.GetUser(user); 

if (membershipUser != null && membershipUser.IsApproved) 
{ 
    string userRoles = string.Empty; // Get all their roles 
    FormsAuthenticationUtil.RedirectFromLoginPage(user, userRoles, true); // Create FormsAuthTicket + Cookie + 
} 

tôi đã viết một bài đăng blog về vấn đề này trong một thời gian dài trước đây, ở đây là một liên kết đến các wrapper cho netapi32.dll và helper Mạo danh của tôi mà tôi cung cấp trong bài Source Code Download

+1

cảm ơn bạn đã trả lời chi tiết của bạn, tôi không đánh dấu nó là câu trả lời nhưng tôi cảm thấy nó có thể có mối quan tâm với an ninh và tổng thể có một 'hack' cảm thấy :-) –

+1

Nó chắc chắn là một hack .. – Zachary

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