net - formsauthentication c#
Asp.net deja de obedecer las listas blancas de autenticación de formularios al azar (4)
¿Puede mostrar su nodo de autenticación desde su web.config? Debería ser algo como esto:
<authentication mode="Forms">
<forms name="Logon" loginUrl="~/Logon.aspx" protection="All" timeout="60" defaultUrl="~/Default.aspx" />
</authentication>
¿Está utilizando el servidor de estado de sesión de asp.net? Si lo hace, compruebe si el servicio asp.net state server está iniciado.
El problema
El mes pasado, trasladamos nuestra granja de sitios web asp.net de Server 2008 R2 a Server 2012 R2 y actualizamos a asp.net 4.5. Estamos utilizando la autenticación de formularios cocinados para evitar el acceso no autorizado al sitio web.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
Tenemos ciertos recursos y páginas (por ejemplo, página de inicio de sesión) que están en la lista blanca en el web.config:
<location path="signin">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
En los últimos meses hemos notado que IIS / Asp.net deja de obedecer la lista blanca al azar y asume que todo debe estar autenticado. Todas las solicitudes al sitio en ese servidor serán redirigidas a la página de inicio de sesión que luego arroja un error 500. No se pueden recuperar activos en lista blanca.
Luego hay 2 errores en el visor de eventos que podemos ver cuando IIS está desordenado. El primero:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at System.Web.PipelineModuleStepContainer.GetNextEvent(RequestNotification notification, Boolean isPostEvent, Int32 eventIndex)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
Este segundo no aparece todo el tiempo:
Event code: 4005
Event message: Forms authentication failed for the request. Reason: The ticket supplied has expired.
El proceso iis estará funcionando durante horas y luego, de repente, comenzará a hacer esta rareza. Tan pronto como reciclemos el grupo de aplicaciones, o simplemente modifiquemos la web. La configuración del sitio comienza a funcionar nuevamente.
Cosas que hemos intentado
Sinceramente estamos bastante perplejos. Esto no sucedió en nuestros servidores antiguos, pero desde entonces hemos realizado algunos cambios en nuestro sitio, pero nada relacionado con la autenticación.
Estamos en una webfarm y definimos nuestra clave de máquina dentro de nuestro web.config.
<machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES" />
Estamos apuntando a asp.net 4.5
<httpRuntime targetFramework="4.5" executionTimeout="120" maxQueryStringLength="4096" minFreeThreads="72" minLocalRequestFreeThreads="88" maxRequestLength="32768" />
Hemos recreado el grupo de aplicaciones dentro de IIS.
- No estoy seguro de si es importante, pero usamos la configuración compartida de IIS y los certificados compartidos.
- El problema está ocurriendo en todos los servidores web de la granja, no solo en uno.
- Ayer reinstalamos el sistema operativo en uno de los servidores ... así que veremos si eso corrige algo.
- No parece estar ligado al uso de la memoria. A veces, iis solo usa 4gb, a veces 6gb.
- No parece estar vinculado a una determinada ejecución de página que podemos decir.
- He ejecutado debug diag contra un volcado de memoria y no hay subprocesos que se estén ejecutando durante mucho tiempo.
Sí, estamos perplejos. Cualquier ayuda es apreciada.
Responderé a mi propia pregunta con lo que hicimos para resolver el problema, aunque nunca encontramos la causa raíz. Notamos que el servidor comenzaría a ignorar las reglas de la lista blanca cuando se pusiera demasiado pesado bajo carga. No mucha carga, tal vez 40% de utilización en el transcurso de 5 minutos. Después de eso empezaría a ignorar las cosas.
La solución simple para nosotros fue lanzar más hardware al problema. Estamos ejecutando 6 servidores web en lugar de 3. No hemos visto el problema de la lista blanca desde entonces. Así que honestamente ... no tenemos idea de lo que pasa.
Si bien no puedo decir exactamente cuál es el problema, puedo compartir una experiencia similar. Tuvimos un sitio que usaba formularios de autenticación y también asumimos que estaba fallando y obligando a todos a autenticarse. Lo que descubrimos fue que el sitio web estaba fallando e IIS estaba devolviendo el sitio web predeterminado. Nos tomó un tiempo entenderlo. Es posible que desee verificar para asegurarse de que no está viendo una situación similar.
Tuve una experiencia similar, cambiando IIS para permitir que la autenticación anónima la resolviera por mí. En tu caso, te recomendaría 2 cosas:
- Intente habilitar la autenticación anónima en IIS (visite http://technet.microsoft.com/en-us/library/cc770966%28v=ws.10%29.aspx para ver cómo)
- Modifique su código como se muestra a continuación
<location path="signin">
<system.web>
<authorization>
<allow users="?" />
<allow users="*" />
</authorization>
</system.web>
</location>
espero que esto ayude