2011-06-27 25 views
9

Tôi muốn có thể phát hiện, từ mã ASP.NET, cho dù IIS hiện có "Windows Authentication" "available"?ASP.NET code để phát hiện xem IIS "Windows Authentication" có được kích hoạt

Bắt đầu từ ứng dụng của tôi cài đặt và đang chạy dưới "Anonymous Access", tôi muốn để phát hiện:

  1. "Windows Authentication" thành phần đã thực sự được cài đặt trong IIS (ví dụ như một số IIS7 có nó không cài đặt bởi mặc định); và ...
  2. "Xác thực Windows" thực sự là "Đã bật" trên gốc/vị trí ảo của tôi.

Tôi muốn thông tin này cho phép Quản trị viên biết liệu anh ấy có cần thực hiện hành động trong IIS trước anh ấy thực sự cố gắng chuyển đổi nó trên ứng dụng của tôi hay không.

(Do đó, ví dụ, tôi nghĩ IIS7: How to define that windows authentication is turned on? không giúp tôi, vì điều đó đang xem xét cho dù đó là đã có trên cho ứng dụng của tôi;. Tôi muốn biết liệu nó được cài đặt/có thể được bật)

"Giải pháp" của tôi sẽ cần phải làm việc (hoặc ít nhất là không "thất bại") với các phiên bản của IIS trước 7 cũng như 7 chính nó, vì vậy nếu có sự khác biệt tôi cần biết. Cảm ơn.

+0

Phiên bản nào của IIS cần được hỗ trợ? Bạn có cần hỗ trợ IIS 1.0 (một add-on Windows NT 3.51) không? –

+0

:-) Tôi sẽ * thích * để hỗ trợ trở lại IIS 5 và 6, nhưng nếu một giải pháp là 7 chỉ tôi có thể sống với điều đó miễn là tôi có thể thử nghiệm cho 7/không phá vỡ máy chủ IIS cũ hơn. – JonBrave

+0

Đối với # 1, tôi cho rằng tôi có thể đi theo tuyến đường http://learn.iis.net/page.aspx/135/discover-installed-components/ và kiểm tra sổ đăng ký cho "WindowsAuthentication" (như tôi làm từ chương trình thiết lập cho "IIS Metabase Compatibility"), có vẻ lộn xộn nhưng nếu không có gì khác có sẵn? Nhưng đối với # 2, tôi không nghĩ rằng sổ đăng ký sẽ cho tôi biết? – JonBrave

Trả lời

1

Đây không phải là câu trả lời quá nhiều như một ý tưởng chỉ cho bạn theo một hướng có thể.

Ứng dụng web thường bị cô lập với chính nó và chạy ít nhất đặc quyền vì vậy tôi không nghĩ bạn có thể thấy các cài đặt chung như thế này từ mã ASP của ứng dụng.

Tôi đoán bạn sẽ muốn xem các lớp WMI. Bạn có thể truy vấn chúng bằng cách sử dụng ADO hoặc các đối tượng WMI. Bạn có thể cần mạo danh các thông tin đăng nhập cao hơn để gọi nó.

Xem bài đăng này TechNet Article

+0

Cảm ơn bạn và tôi hiểu những gì bạn đang nói. Tuy nhiên, tôi nghĩ rằng sẽ có quá nhiều biến chứng để đáp ứng nhu cầu. – JonBrave

2

Khi Windows Authentication được kích hoạt, IIS trả về HTTP header này trong phản ứng:

WWW-Authenticate: NTLM 

Có thể gửi một yêu cầu kiểm tra HTTP với một WebClient, chờ cho nó và kiểm tra sự hiện diện tiêu đề.

3

Câu trả lời của tôi dựa trên yêu cầu tối thiểu của @Paul Stovell (rằng nó chỉ cần làm việc cho IIS 7). Khi WindowsAuthentication được cài đặt, file applicationHost.config sẽ có các mục sau đây trong phần <globalModules>:

<add name="WindowsAuthenticationModule" image="%windir%\System32\inetsrv\authsspi.dll" /> 

Sử dụng Microsoft.Web.Administration.dll, có thể được tìm thấy trong %windir%\System32\inetsrv\, người ta có thể kiểm tra sự tồn tại của WindowsAuthenticationModule với mã sau:

ConfigurationSection globalModulesConfig = config.GetSection("system.webServer/globalModules"); 
ConfigurationElementCollection globalModulesCollection = globalModulesConfig.GetCollection(); 
bool installed = globalModulesCollection.FirstOrDefault(a => a.GetAttribute("name").Value.Equals("WindowsAuthenticationModule")) != null; 

Vì tệp ứng dụngHost.config nằm trong %windir%\System32\inetsrv\config, ứng dụng thực hiện truy vấn này yêu cầu đặc quyền cao.

3

Trên trang aspx mặc định, hãy kiểm tra xem người dùng có được đặt thành loại WindowsPrincipal không.Nếu Windows authenication không được kích hoạt thì kiểu sẽ khác.

Cũng để tự động hóa cửa sổ để hoạt động, trình duyệt phải được định cấu hình để bắt tay NTLM.

Sẽ thêm một số mã sau!

1

Sau đây kiểm tra cài đặt web.config/IIS tôi tin. Bạn có thể thêm các kiểm tra khác tại mỗi phiên bản để xem các phần cấu hình đã được xác định hay chưa ...

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 

SystemWebSectionGroup configSection = (SystemWebSectionGroup)config.GetSectionGroup("system.web"); 

AuthenticationSection auth = configSection.Authentication; 

if (auth.Mode == AuthenticationMode.Forms) { } 
else if (auth.Mode == AuthenticationMode.Windows) { } 
Các vấn đề liên quan