2011-06-27 11 views
9

Me gustaría poder detectar, a partir del código ASP.NET, si IIS tiene actualmente "Autenticación de Windows" "disponible".Código ASP.NET para detectar si la "Autenticación de Windows" de IIS está habilitada

A partir de mi aplicación se instala y se ejecuta actualmente en "Acceso anónimo", quiero detectar: ​​

  1. "Autenticación de Windows" componente de realidad se ha instalado en IIS (por ejemplo, algunos IIS7 haber no instalado por defecto); y ...
  2. "Autenticación de Windows" está realmente "Activado" en mi raíz/ubicación virtual.

Quiero esta información para que el administrador sabe si tiene que tomar medidas en IIS antes que en realidad intenta encenderlo en mi solicitud.

(De ahí, por ejemplo, creo que IIS7: How to define that windows authentication is turned on? no me ayuda, ya que es observar si el mismo ya está en mi solicitud;. Quiero saber si se instala/puede ser encendido)

Mi "solución" tendría que funcionar (o al menos no "fallar") con versiones de IIS anteriores a 7 y 7 en sí, por lo que si hay diferencias, necesito saber. Gracias.

+0

¿Qué versiones de IIS necesitan soporte? ¿Necesita soportar IIS 1.0 (un complemento de Windows NT 3.51)? –

+0

:-) Quisiera * darme * apoyo para IIS 5 y 6, pero si una solución es 7 solo podría vivir con eso, siempre que pueda probar 7/no rompa hosts IIS antiguos. – JonBrave

+0

Para el n. ° 1, supongo que podría seguir la ruta http://learn.iis.net/page.aspx/135/discover-installed-components/ y consultar el registro de "Autenticación de Windows" (como hago desde el programa de instalación para "Compatibilidad con metabase de IIS"), parece desordenado, pero si no hay nada más disponible? Pero para el n. ° 2, ¿no creo que el registro me dirá? – JonBrave

Respuesta

1

Esto no es una respuesta sino solo una idea para indicarle una posible dirección.

Una aplicación web normalmente está aislada y se ejecuta con menos privilegios, por lo que no creo que pueda ver configuraciones globales como esta desde el código ASP de una aplicación.

Supongo que le gustaría ver las clases de WMI. Puede consultarlos usando ADO o los objetos WMI. Es posible que deba suplantar credenciales superiores para llamarlo así.

Ver este post TechNet Article

+0

Gracias, y entiendo lo que dices. Sin embargo, creo que sería demasiada complicación para satisfacer la necesidad. – JonBrave

2

Cuando se habilita la autenticación de Windows, IIS devuelve esta cabecera HTTP en respuesta:

WWW-Authenticate: NTLM 

Es posible enviar una solicitud de pruebas de HTTP con un cliente Web, esperar a que él y compruebe la presencia del encabezado.

3

Mi respuesta se basa en los requisitos mínimos de @Paul Stovell (que solo necesita trabajar con IIS 7). Cuando se WindowsAuthentication instalado, el archivo applicationHost.config tendrá la siguiente entrada en la sección <globalModules>:

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

Usando Microsoft.Web.Administration.dll, que se puede encontrar en %windir%\System32\inetsrv\, se puede comprobar la existencia de la WindowsAuthenticationModule con el siguiente código:

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

Dado que el archivo reside en applicationHost.config %windir%\System32\inetsrv\config, la aplicación que efectúa esta consulta requiere privilegios elevados.

3

En la página aspx predeterminada, compruebe si el usuario está configurado en un tipo de WindowsPrincipal.Si la autenticación de Windows no está habilitada, el tipo será diferente.

También para que la autenticación de Windows funcione, el navegador debe configurarse para el protocolo de enlace NTLM.

¡Agregue algunos códigos más tarde!

1

Lo siguiente comprueba la configuración de web.config/IIS, creo. Puede agregar más comprobaciones en cada instanciación para ver si las secciones de configuración están definidas, etc. ...

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) { } 
Cuestiones relacionadas