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).
"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? –
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. –