11

Đây là những gì tôi đã cố gắng làmTôi có thể mạo danh một khách hàng được xác thực bằng biểu mẫu auth và thiết lập kết nối đáng tin cậy với SQL Server không?

Xây dựng ứng dụng ASP.NET MVC 3 với xác thực biểu mẫu và thành viên thư mục hoạt động. Máy chủ web và cơ sở dữ liệu là các máy chủ vật lý khác nhau do đó một bước nhảy kép.

Tôi nghĩ câu trả lời là bài viết cũ hơn này trên constrained delegation and protocol transition? Cho đến nay, tôi đã không thể có được kỹ thuật để làm việc.

Tôi đang thử nghiệm điều này từ máy DEV (Windows 7, IIS7) cho máy chủ web trước khi triển khai lên Windows 2008 (IIS7) trong quá trình thiết lập sản xuất. Windows 2008 có tạo sự khác biệt không?

Điều gì làm việc và những gì không

Tôi có thể đăng nhập bằng hình thức auth và các thành viên AD. Điều này dường như làm việc tốt. Khi tôi cố thực hiện cuộc gọi cơ sở dữ liệu bằng mã này:

public void AsUser(Action action) 
    { 
     using (var id = new WindowsIdentity(User.Identity.Name + @"@example.com")) 
     { 
      WindowsImpersonationContext context = null; 
      try 
      { 
       context = id.Impersonate(); 
       action.Invoke(); 
      } 
      catch (Exception ex) 
      { 
       // ex.Message is The type initializer for System.Data.SqlClient.SqlConnection threw an exception 
       // buried inner exeption is Requested registry access is not allowed 
      } 
      finally 
      { 
       if (context != null) 
       { 
        context.Undo(); 
       } 
      } 
     } 
    } 

Không có ngoại lệ khiến tôi có vấn đề về thiết lập trên máy chủ DEV cục bộ của mình. Ngoại lệ bên trong là Requested registry access is not allowed.

Nếu tôi đặt điểm ngắt và kiểm tra WindowsIdentity sau cuộc gọi Impersonate() Tôi thấy rằng ImpersonationLevel được đặt thành Identification. Điều này có vẻ như một đầu mối rằng nó không được thiết lập đúng. Có ai xác nhận không?

Tôi đang đi đúng hướng và điều này thậm chí có thể thiết lập không? Mọi con trỏ sẽ được đánh giá cao.

Trả lời

5

Tôi nghĩ bạn đang đi đúng hướng. Bạn chỉ cần thêm công việc khắc phục sự cố trên thiết lập chuyển đổi giao thức của mình.

Tôi cho rằng bạn đã định cấu hình nhà cung cấp thành viên Active Directory của mình một cách chính xác để bạn có thể đăng nhập thành công trang web của mình bằng tên người dùng và mật khẩu của thư mục hoạt động. Nếu đó không phải là trường hợp, vui lòng bỏ qua phần còn lại của câu trả lời của tôi :)

Từ những gì tôi thấy trong câu hỏi của bạn, bạn có mã thông báo của người dùng bằng S4USelf bởi WindowsIdentity. Sau đó, bạn đang sử dụng S4UProxy để chuyển mã thông báo mạo danh tới máy chủ SQL. Vì bạn nói rằng bạn chỉ có ImpersonationLevel.Identification, điều đó có nghĩa là bạn không thể thực hiện chuyển đổi giao thức.

Bạn cần hiểu rằng việc cho phép một máy thực hiện chuyển tiếp giao thức trong miền là đặc quyền rất cao.Việc cấp một máy chủ để thực hiện quá trình chuyển đổi giao thức hầu như có nghĩa là bạn tin tưởng rằng máy chủ gần giống như một bộ điều khiển miền. Bạn cần phải có ý thức đưa ra quyết định này trong AD để biến một máy chủ để có khả năng này và bạn phải là một quản trị viên domian để thực hiện thay đổi này. Nếu bạn chưa làm điều này, có thể bạn đã không thiết lập đúng cách.

Có vài điều cần kiểm tra.

Trước tiên, hãy đảm bảo bạn đã chọn "Tin cậy máy tính này để chỉ ủy quyền cho các dịch vụ được chỉ định" và sau đó bạn đã chọn "chọn Sử dụng bất kỳ giao thức xác thực nào" trên tài khoản dịch vụ của mình. Bạn có thể muốn tạo một tài khoản miền. Here là một liên kết về cách tạo tài khoản dịch vụ cho ASP.NET. Hãy nhớ rằng, bạn cần một tài khoản miền. Sau khi bạn tạo tài khoản dịch vụ miền, hãy đảm bảo bạn truy cập tab ủy quyền trên tài khoản đó và chọn các tùy chọn chính xác.

Thứ hai, bạn cần đảm bảo SPN được đặt chính xác. Tôi nhận ra rằng liên kết mà bạn đăng chỉ đề cập đến SPN của tài khoản dịch vụ ASP.NET của bạn. Trên thực tế, bạn cũng cần đảm bảo rằng tài khoản dịch vụ trên máy chủ SQL của bạn cũng được đặt đúng. Ngoài ra, Windows sẽ không sử dụng xác thực Kerberos. Nó sẽ rơi trở lại để sử dụng NTLM. Có rất nhiều chi tiết để thiết lập SPN một cách chính xác trên máy chủ SQL. Bạn có thể kiểm tra here trước và xem bạn có may mắn không. Từ kinh nghiệm của tôi, hầu hết các DBA không biết làm thế nào để thiết lập chúng đúng cách. Họ thậm chí không nhận thức được nó bởi vì hầu hết các ứng dụng làm việc tốt với NTLM. Bạn cần chú ý đến tài khoản dịch vụ máy chủ SQL và số cổng mà nó đang sử dụng.

Thứ ba, bạn cần đảm bảo rằng không có gì vô hiệu hóa ủy quyền Kerberos của bạn. Theo mặc định, một số tài khoản AD nhạy cảm không được ủy quyền. Ví dụ: tài khoản quản trị viên tích hợp. Vì vậy, bạn nên sử dụng một số tài khoản người dùng bình thường khác cho mục đích thử nghiệm.

CẬP NHẬT

Tôi chỉ tìm thấy another article giảng dạy bạn làm thế nào để thiết lập sự chuyển đổi giao thức cho ASP.NET. Nó đã đề cập rằng bạn cần cấp quyền TCB cho tài khoản dịch vụ IIS để đảm bảo rằng nó có thể tạo một WindowsIdentity loại Impersonation. Bạn có thể cho nó một shot.

+0

Cảm ơn tất cả thông tin. Rất nhiều điều mới mẻ đối với tôi. Tôi chưa có thời gian để thiết lập lại mọi thứ và bắt đầu với kiến ​​thức mới này nhưng tôi tự tin hơn rằng tôi có thể làm cho nó hoạt động ngay bây giờ. –

+0

Điều này kinda sucks ... với 13 phút cho đến khi tiền thưởng đã lên tôi chọn của bạn như là câu trả lời không nhận ra rằng đó là khác nhau hơn "trao" tiền thưởng. Bạn có một nửa những gì bạn nên có. Tôi xin lỗi tôi đã không hiểu hệ thống hoặc có thể tôi đã bỏ lỡ các manh mối trong giao diện người dùng - dù bằng cách nào xấu. –

+0

@Aaron Đừng lo lắng. Cảm ơn bạn đã chấp nhận câu trả lời của tôi. Sau khi bạn nhận được transistion giao thức làm việc, thực sự có một số vấn đề kerberos tổng quát hơn mà bạn có thể chạy vào. Ví dụ. nếu có SPN trùng lặp trong cùng một rừng AD, xác thực Kerberos sẽ ngừng hoạt động âm thầm. Rất khó để viết một câu trả lời hoàn chỉnh cho loại câu hỏi này. Nếu chúng ta có thể, MSDN sẽ không cần phải có nhiều bài viết và KB cho vấn đề tương tự. Nếu bạn đang gặp phải một số vấn đề AD khác, hãy gắn thẻ câu hỏi với 'active-directory'. Bạn có thể nhận được nhiều gợi ý hữu ích hơn –

1

Bạn đã bật Mạo danh trên máy tính Windows 7 hoặc Windows 2008 chưa? Bài viết này trình bày cách thiết lập. http://technet.microsoft.com/en-us/library/cc730708(WS.10).aspx. Ngoài ra, bạn đang chạy 32-bit hoặc 64-bit?

+0

64 bit. Điều này có quan trọng không? –

+0

Đôi khi. Trong trường hợp này tôi nghi ngờ nó. Thông tin thêm luôn tốt hơn mặc dù – Spidy

1

Bạn cũng nên kiểm tra với quản trị AD của mình để xem có cho phép Mạo danh hay không. Các công ty của tôi Các chính sách AD sẽ không cho phép mạo danh.

2

Đây là lớp tôi sử dụng. Ngoài ra, bạn sẽ muốn kiểm tra và xem liệu quá trình mà AppPool đang chạy có đủ quyền để thực hiện mạo danh vì nó là một hoạt động đặc quyền như vậy hay không. Tôi sẽ cung cấp cho các tài khoản người dùng rằng các hồ bơi ứng dụng đang chạy dưới quyền quản trị tạm thời (dev hộp chỉ của khóa học) và xem nếu nó hoạt động, do đó bạn sẽ biết nếu nó là một vấn đề quyền.

public class ImpersonationHelper : IDisposable 
    { 
     private const int LOGON32_LOGON_INTERACTIVE = 2; 
     private const int LOGON32_PROVIDER_DEFAULT = 0; 
     private WindowsImpersonationContext _impersonationContext; 
     private string _userName; 
     private string _domain; 
     private string _password; 

     [DllImport("advapi32.dll")] 
     public static extern int LogonUserA(String lpszUserName, 
      String lpszDomain, 
      String lpszPassword, 
      int dwLogonType, 
      int dwLogonProvider, 
      ref IntPtr phToken); 
     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern int DuplicateToken(IntPtr hToken, 
      int impersonationLevel, 
      ref IntPtr hNewToken); 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool RevertToSelf(); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
     public static extern bool CloseHandle(IntPtr handle); 

     public ImpersonationHelper(string domain, string userName, string password) 
     { 
      _userName = userName; 
      _domain = domain; 
      _password = password; 
     } 

     public void Start() 
     { 
      WindowsIdentity tempWindowsIdentity; 
      IntPtr token = IntPtr.Zero; 
      IntPtr tokenDuplicate = IntPtr.Zero; 

      if (RevertToSelf()) 
      { 
       if (LogonUserA(_userName, _domain, _password, LOGON32_LOGON_INTERACTIVE, 
        LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
       { 
        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
        { 
         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
         _impersonationContext = tempWindowsIdentity.Impersonate(); 
         if (_impersonationContext != null) 
         { 
          CloseHandle(token); 
          CloseHandle(tokenDuplicate); 
         } 
        } 
       } 
      } 
      if (token != IntPtr.Zero) 
       CloseHandle(token); 
      if (tokenDuplicate != IntPtr.Zero) 
       CloseHandle(tokenDuplicate); 
     } 

     #region IDisposable Members 

     void IDisposable.Dispose() 
     { 
      if (_impersonationContext != null) 
      { 
       _impersonationContext.Undo(); 
      } 
     } 

     #endregion 
    } 
+0

Cảm ơn bạn đã nhập mã. Tôi hy vọng sẽ ở lại trong vùng đất được quản lý hạnh phúc mà không có các cuộc gọi bên ngoài, nhưng nếu nói đến điều này tôi sẽ cho nó một shot. –

1

Tôi nghĩ bạn đã xác định được sự cố nhưng không ai đề cập đến nó. Vấn đề "double hop" sẽ không cho phép bạn làm điều này. Điều đó là không thể. Có rất nhiều người đã viết về nó như là Scott Forsyth.

Khi bạn xác thực đến máy chủ IIS sử dụng Integrated Authentication, mà sử dụng hết bạn đầu tiên 'hop'. Khi IIS cố gắng truy cập một thiết bị mạng, đó sẽ là bước nhảy đôi hoặc nhảy thứ hai không được phép là . IIS không thể lần lượt vượt qua trên các thông tin đăng nhập đó tới mạng tiếp theo thiết bị, nếu không nhà phát triển hoặc quản trị viên có thể lạm dụng thông tin đăng nhập của bạn và sử dụng chúng theo cách mà khách truy cập trang web không lường trước được.

này không xảy ra với vô danh truy cập hoặc mạo danh tắt vì trong trường hợp đó IIS sẽ chăm sóc của chứng thực bạn và sau đó nó sử dụng một người dùng khác nhau cho địa phương hoặc mạng truy cập. Điều này có nghĩa là hồ sơ ứng dụng danh tính hoặc người dùng ẩn danh có thể thực hiện cuộc gọi mạng làm hop đầu tiên.

Tôi nghĩ rõ ràng là bạn không thể chuyển thông tin đăng nhập của mình xa hơn kết nối đầu tiên.

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