2010-01-20 40 views
14

Tôi đang cố sử dụng Mạo danh và Ủy quyền trong ứng dụng web ASP.Net của mạng nội bộ để chuyển thông tin đăng nhập của người dùng đã xác thực vào Máy chủ SQL.Ứng dụng web ASP.Net đang cố gắng sử dụng Mạo danh và Ủy quyền để kết nối với SQL Server

Máy chủ web và máy chủ SQL là hai máy riêng biệt, nhưng trong cùng một miền, do đó cần phải ủy quyền.

tôi đã thực hiện như sau:

  • thiết <authentication mode="Windows"/><identity impersonate="true"/> trong web.config của tôi ứng dụng web của.
  • bật Ủy quyền bị hạn chế từ máy chủ web đến dịch vụ MSSQLSvc trên Máy chủ SQL, trong Active Directory.
  • chỉ cho phép xác thực Windows trong trang web, thông qua IIS.

Dường như điều này tất cả đều có tác dụng, nhưng không (máy chủ SQL từ chối truy cập người dùng ẩn danh - "Đăng nhập không thành công cho người dùng 'NT AUTHORITY \ ANONYMOUS LOGON'").

Trong IIS7, Hồ bơi ứng dụng được đặt để sử dụng Chế độ tích hợp Pipleline và đang chạy với Nhận dạng mạngService. Trang web chỉ được bật Xác thực Windows, Bảo vệ mở rộng bị tắt, Xác thực chế độ lõi được bật và NTLM là nhà cung cấp.

Tất cả các trang web tôi đã đọc dường như cho biết rằng thiết lập của tôi sẽ hoạt động. Tôi đang thiếu gì?

+0

"Máy chủ SQL đang từ chối quyền truy cập vào người dùng ẩn danh", người dùng nặc danh của bạn có quyền truy cập cơ sở dữ liệu không? –

+0

Người dùng ẩn danh không có quyền truy cập vào cơ sở dữ liệu. Tôi không muốn người dùng nặc danh truy cập vào cơ sở dữ liệu, tôi muốn người dùng hiện tại của trang web. Phái đoàn có nghĩa là người dùng hiện tại là người truy cập vào cơ sở dữ liệu, thay vì người dùng ẩn danh. –

Trả lời

16

Tôi đã khám phá ra câu trả lời:

Nhà cung cấp Windows Authentication trong IIS7 phải được thiết lập để Negotiate: Kerberos, không NTLM. Điều này có nghĩa là cài đặt xác thực chế độ Kernel phải được tắt. Điều này có vẻ ổn. Tôi nghĩ rằng tôi đúng khi nói rằng xác thực chế độ hạt nhân là bắt buộc khi sử dụng danh tính tùy chỉnh, tức là một danh tính cụ thể. Phái đoàn có thể sử dụng số lượng nhận dạng tùy ý. Vì vậy, tất cả là tốt.

Tôi cũng đã viết một số blog post về chi tiết này, chi tiết hơn một chút.

+0

Bài đăng trên blog tuyệt vời, cảm ơn bạn rất nhiều :) – Chiramisu

+0

Bạn có bất kỳ vấn đề nào với người dùng không nhận được thông tin đăng nhập của họ được chuyển tiếp đến máy chủ SQL khi sử dụng trình duyệt khác với Internet Explorer không? Tôi đã tìm thấy rằng một khi họ đã có một phiên được thiết lập trong IE thì trang web có thể ủy quyền thông tin đăng nhập của họ nếu họ chuyển sang một trình duyệt khác. –

-1

Không - không chính xác khi nói rằng bạn cần Kerberos, SPN, để tin cậy máy chủ để ủy quyền và đây là cách duy nhất để thực hiện. Có, đây là một cách để làm điều đó (và bạn cần tất cả nó để làm cho nó xảy ra thông qua Kerberos), nhưng nó không phải là cách duy nhất, hoặc thậm chí về mặt kỹ thuật cách an toàn nhất hoặc cách dễ nhất. Bạn có thực sự muốn phải làm thêm các cấu hình và tạo đăng nhập cho mỗi người dùng web vào DB của bạn trong SQL không? Điều gì xảy ra nếu bất kỳ tài khoản nào trong số đó bị xâm nhập? Thêm tài khoản, nhiều lỗ hổng hơn.

Không, tạo tài khoản dịch vụ miền, thay vào đó và cho phép truy cập SQL đó. Nếu các nhân viên bảo mật của bạn khóa mọi thứ, hãy cấp cho người dùng quyền này: Đăng nhập như một dịch vụ, Đăng nhập dưới dạng tác vụ hàng loạt và Cho phép đăng nhập cục bộ. Hoặc, nếu đây chỉ là để phát triển và kiểm tra lý thuyết hoặc bạn không quan tâm hoặc không thể tìm thấy cài đặt hoặc vẫn nhận được lỗi sau này và điều này có thể không nhận được lượng người theo dõi lớn, nhưng hãy cấp cho quản trị viên cục bộ (đôi khi bạn gotta làm những gì bạn phải làm - một số chuyên gia bảo mật khóa những thứ chặt chẽ hơn tôi sẽ quan tâm để viết về - luôn luôn có thể khắc phục sự cố bảo mật sau này để khóa nó trở lại). Sau đó, đặt tài khoản đó làm tài khoản tùy chỉnh trên nhóm ứng dụng và cấp cho tài khoản đó một thông tin đăng nhập bằng SQL. Cho nó dbo trên cơ sở dữ liệu THAT ONE.

Trên trang web trong IIS, hãy đặt loại xác thực là Windows. Tôi đã nhìn thấy họ nói "cơ bản" trong các blog khác để Kerberos sẽ làm việc, nhưng NTLM sử dụng xác thực Windows. Trong IIS 7, bạn cũng có thể muốn kích hoạt ASP.NET mạo danh. Cá nhân, tôi đã chỉ cố gắng này trên IIS 6, nhưng hiệu trưởng là như nhau.

Trong web.config, thêm này theo <configuration>, mà là một "ngang hàng" để <system.web>:

<connectionStrings> 
    <add 
    name="NorthwindConnectionString" 
    connectionString="Data Source=serverName;Initial 
    Catalog=Northwind;Integrated Security=SSPI;User 
    ID=userName;Password=password" 
    providerName="System.Data.SqlClient" 
    /> 
</connectionStrings> 

Và trong <system.web>:

<authentication mode="Windows"/> 
<identity impersonate="true" 
     userName="domain\user" 
     password="password" /> 

Sau đó đọc chuỗi vào ứng dụng của bạn như này:

using System.Configuration; 

string connString = String.Empty; 
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0) 
{ 
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here 
     Console.WriteLine("Northwind connection string = \"{0}\"", 
     connString.ConnectionString); 
    else 
     Console.WriteLine("No Northwind connection string"); 
} 

Xem http://msdn.microsoft.com/en-us/library/ms178411.aspx.

Nếu nó không kết nối với tài khoản dịch vụ sau khi điền vào tài khoản đó trong web.config cho thẻ mạo danh và kết nối SQL, bạn có thể sử dụng phương pháp mạo danh bằng WindowsImpersonationContext (http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx). Cụ thể, bạn muốn wic.Impersonate() và wic.Undo() sau khi nhận được mã thông báo của họ. Bạn có thể đọc trong miền tài khoản dịch vụ, tên và mật khẩu từ web.config, dưới dạng AppKeys.

Tóm lại, có nhiều cách giải quyết vấn đề. Bạn thậm chí có thể mã hóa mật khẩu trong web.config - cả trong ConnectionString và nếu bạn muốn lưu trữ nó trong AppKey thay vì trực tiếp trong thẻ "mạo danh", nếu bạn không muốn mật khẩu văn bản thuần túy trong đó Tôi khuyên bạn nên chống lại), và vì vậy bạn có thể có nó cho việc tạo ra một mã thông báo đăng nhập, nếu bạn cần phải sử dụng các phương pháp mạo danh (như tôi đã làm).

+0

Điều này không thực sự trả lời câu hỏi của mình –

+0

@FireLizzard, uh, tôi đã cung cấp tất cả các bước cần thiết để "sử dụng Mạo danh và Ủy quyền trong ứng dụng web ASP.Net của mạng nội bộ để chuyển thông tin đăng nhập của người dùng đã xác thực vào Máy chủ SQL". Điều này đòi hỏi 1) một tài khoản svc, 2) quyền trong chính sách an ninh địa phương (mô tả ở trên) 3) quyền trong SQL (dbo - mô tả ở trên), 3) thêm tài khoản để nhận dạng App Pool, 4) thiết lập trang web trong IIS cho Windows xác thực, 5) thiết lập chuỗi conn trong web.config, 6) thiết lập thẻ xác thực và nhận dạng trong web.config, 7) thêm chuỗi kết nối vào mã, 8) sử dụng mã mạo danh tại liên kết MSDN nếu nó không hoạt động. – vapcguy

+0

Các môi trường khác nhau sẽ có các quyền khác nhau, theo như các tài khoản đi, và anh ta có thể hoặc không có đặc quyền để cung cấp cho tài khoản các quyền cần thiết. Không biết môi trường của mình, thật khó để đưa ra các chi tiết cụ thể về chính xác những gì sẽ làm việc. Anh ta sẽ cần phải cố gắng cho các svc acct các quyền tôi chỉ định, và thiết lập các trang web và web.config. Có lẽ nó sẽ hoạt động mà không có mã mạo danh MSDN, có thể không. Để thực hiện của tôi, tôi đã hoàn thành khi tôi đăng các bước này, tôi cần nó. Đối với một trong những tôi đã thực hiện gần đây bằng cách sử dụng Kerberos, SPNs, và một accvc svc, tôi đã không. – vapcguy

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