Pregunta

Tengo una aplicación web bastante compleja que fue construida (por un contratista) para usar la autenticación integrada. Como parte del proceso de autenticación, se utiliza una función GetNetworkID () que tiene este aspecto:

private string GetNetworkID()
{
    return HttpContext.Current.User.Identity.Name.Split(new char[] { '\\' })[1];
}

Cuando ejecuto esto en mi cuadro de desarrollo, el valor de HttpContext.Current.User.Identity.Name es myNetwork \\ myUserID , por lo que la función anterior devuelve mi ID de usuario, según lo previsto, y el proceso de autenticación funciona bien.

Pero cuando ejecuto esto en mi servidor web, obtengo un error de El índice estaba fuera de los límites de la matriz emitido por la declaración de retorno en la función GetNetworkID () .

Estoy un poco perdido sobre cómo solucionar este problema y cómo averiguar si se trata de un problema de configuración de IIS (mi servidor web es una caja de Windows Server 2008 que ejecuta IIS 7), o algo más.

Si codifico mi ID de usuario como el valor de retorno para la función GetNetworkID () , funciona en el servidor web, pero no tengo grandes ideas sobre cómo depurar el servidor web para determinar cuál es el valor de retorno de HttpContext.Current.User.Identity.Name que está causando el error de índice de la matriz.

¿Alguna sugerencia?

¿Fue útil?

Solución

IIS se ejecuta como la cuenta de servicio de IIS, por lo que Current.User.Identity probablemente será el nombre de la cuenta de IIS.

Por razones de integridad, debe verificar '\' con Buscar () o llamando a split, y verificando la longitud de la matriz resultante. Si la longitud es 1, eso significa que la identificación no está en la forma de dominio \ nombre de usuario.

En general, si desea depurar, puede escribir cualquier valor en la secuencia de Respuesta HTTP de la siguiente manera:

Response.Write(HttpContext.Current.User.Identity.Name)

Otro método consiste en configurar una variable de página ASP y establecer la variable de página en el valor que desea inspeccionar. Puede mostrar el valor de la variable a través del código ASP o a través de Javascript.

Otros consejos

Es posible que te falte una configuración de IIS.

Probar en IIS: Sitio web (clic derecho) | Propiedades | Seguridad de directorios (pestaña)

Haz clic en " Editar ... "

Luego selecciona " Autenticación de Windows integrada "

Creo que el usuario que inicia sesión en su aplicación web en el otro servidor no es un inicio de sesión válido. Y por lo tanto, un resultado no se devuelve en User.Identity.Name.

Como dijiste, funciona cuando codificaste el nombre de usuario. Esto significa que las credenciales de usuario de la PC que está utilizando para iniciar sesión no están permitidas en su sitio. Por lo tanto, esto debe ser diferente a las credenciales que está codificando.

La mejor opción es depurar en el servidor web (no es difícil; lo único que desea devolver es User.Identity.Name y puede obtener el nombre de usuario y la lógica de deducción desde allí) y verificar el contenido de su web. archivo .config.

Como Alan señaló (y yo lo voté por él), es probable que desee agregar una verificación de la forma que toma User.Identity.Name . Por ejemplo, una rutina actualizada podría tener este aspecto:

private string GetNetworkID()
{
    var name = HttpContext.Current.User.Identity.Name;
    return name.InStr("\\") > -1 ? name.Split("\\")[1] : name;
}

Esto devolverá la segunda parte del nombre de inicio de sesión si hay un \ y, si no, la cadena completa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top