origin net enable control asp allow addcors asp.net authentication cross-browser

asp.net - enable - net core api cors



¿Hay un navegador equivalente a ClearAuthenticationCache de IE? (7)

¿Por qué no utilizar FormsAuth, pero en lugar de ActiveDirectory según la información de este hilo ? Es tan seguro (como) como Basic Auth, pero cerrar la sesión es simplemente una cuestión de borrar una cookie (o más bien, llamar a FormsAuthentication.SignOut )

Aquí tengo algunas aplicaciones internas de .net que requieren que los usuarios "desconecten" de ellas. Sé que esto puede parecer discutible en una aplicación de Intranet, pero no obstante está ahí.

Estamos utilizando la autenticación de Windows para nuestras aplicaciones de Intranet, por lo que nos vinculamos a nuestro Directorio Activo con Autenticación Básica y las credenciales se almacenan en el caché del navegador, en lugar de una cookie cuando se utiliza la autenticación de formularios .net.

En IE6 + puede aprovechar una función especial de JavaScript que crearon haciendo lo siguiente:

document.execCommand("ClearAuthenticationCache", "false")

Sin embargo, para los otros navegadores compatibles (es decir, Firefox en este momento, pero me esfuerzo por la compatibilidad con varios navegadores), simplemente le muestro al usuario el mensaje de que necesitan cerrar su navegador para cerrar la sesión de la aplicación, que efectivamente vacía el caché de la aplicación.

¿Alguien sabe de algunos comandos / hacks / etc. que puedo usar en otros navegadores para limpiar el caché de autenticación?




He encontrado una solución que parece bastante consistente, pero es hacky y todavía no estoy contento con ella .

Sin embargo funciona :-)

1) Redirigirlos a una página de cierre de sesión

2) En esa página, ejecute un script para ajax y cargue otra página con credenciales ficticias (muestra en jQuery):

$j.ajax({ url: ''<%:Url.Action("LogOff401", new { id = random })%>'', type: ''POST'', username: ''<%:random%>'', password: ''<%:random%>'', success: function () { alert(''logged off''); } });

3) Siempre debe devolver 401 la primera vez (para forzar que se pasen las nuevas credenciales) y luego solo aceptar las credenciales ficticias (muestra en MVC):

[AcceptVerbs(HttpVerbs.Post)] public ActionResult LogOff401(string id) { // if we''ve been passed HTTP authorisation string httpAuth = this.Request.Headers["Authorization"]; if (!string.IsNullOrEmpty(httpAuth) && httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase)) { // build the string we expect - don''t allow regular users to pass byte[] enc = Encoding.UTF8.GetBytes(id + '':'' + id); string expected = "basic " + Convert.ToBase64String(enc); if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase)) { return Content("You are logged out."); } } // return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header this.Response.StatusCode = 401; this.Response.StatusDescription = "Unauthorized"; this.Response.AppendHeader("WWW-Authenticate", "basic realm=/"My Realm/""); return Content("Force AJAX component to sent header"); }

4) Ahora las credenciales de cadenas aleatorias han sido aceptadas y almacenadas en caché por el navegador. Cuando visiten otra página, intentarán usarlas, fallarán y luego solicitarán las correctas.


He estado buscando una solución similar y encontré un parche para Trac (un sistema de gestión de problemas) que hace esto.

He revisado el código (y estoy cansado, así que no estoy explicando todo); básicamente, necesita hacer una llamada AJAX con credenciales inválidas garantizadas a su página de inicio de sesión . El navegador obtendrá un 401 y sabe que necesita pedirle las credenciales correctas la próxima vez que vaya allí. Utiliza AJAX en lugar de una redirección para que pueda especificar credenciales incorrectas y el navegador no abre un cuadro de diálogo.

En la página del parche ( http://trac-hacks.org/wiki/TrueHttpLogoutPatch ) usan AJAX muy rudimentario; algo mejor como jQuery o Prototype, etc. es probablemente mejor, aunque esto hace el trabajo.


Mozilla implementó el objeto crypto, disponible a través del objeto de window DOM, que tiene la función de logout (Firefox 1.5 hacia arriba) para borrar el estado de la sesión SSL en el nivel del navegador para que "la siguiente operación privada en cualquier token requiera la contraseña del usuario nuevamente" (mira this )

El objeto criptográfico parece ser una implementación de la API Web Crypto , y de acuerdo con este documento , la API DOMCrypt agregará aún más funciones.

Como se indicó anteriormente, Microsoft IE (6 hacia arriba) tiene: document.execCommand("ClearAuthenticationCache", "false")

No he encontrado manera de borrar el caché SLL en Chrome (mira this y this informe de errores).

En caso de que el navegador no ofrezca ninguna API para hacerlo, creo que lo mejor que podemos hacer es instruir al usuario para que cierre el navegador.

Esto es lo que hago:

var agt=navigator.userAgent.toLowerCase(); if (agt.indexOf("msie") !== -1) { document.execCommand("ClearAuthenticationCache","false"); } //window.crypto is defined in Chrome, but it has no logout function else if (window.crypto && typeof window.crypto.logout === "function"){ window.crypto.logout(); } else{ window.location = "/page/to/instruct/the/user/to/close/the/browser"; }


Un par de notas. Algunas personas han dicho que debes lanzar una solicitud ajax con credenciales no válidas para que el navegador elimine sus propias credenciales.

Esto es cierto, pero como señaló Keith, es esencial que la página del servidor afirme aceptar estas credenciales para que este método funcione de forma coherente.

En una nota similar: NO es lo suficientemente bueno para que su página solo muestre el diálogo de inicio de sesión a través de un error 401. Si el usuario cancela el diálogo, sus credenciales en caché tampoco se verán afectadas.

También, si puede, presione MOZILLA en https://bugzilla.mozilla.org/show_bug.cgi?id=287957 para agregar una solución adecuada para FireFox. Se registró un error de webkit en https://bugs.webkit.org/show_bug.cgi?id=44823 . IE implementa una solución pobre pero funcional con el método:

document.execCommand("ClearAuthenticationCache", "false");

Es lamentable que tengamos que llegar a estas longitudes solo para desconectar a un usuario.