una tener sólo servidor página puede net formularios form etiqueta ejemplos asp c# asp.net session yui

c# - tener - formularios asp.net ejemplos



¿Puedo poner una ID de sesión de ASP.Net en un campo de formulario oculto? (4)

El ID de sesión de ASP.Net se almacena en Session.SessionID para que pueda establecerlo en un campo oculto y luego publicarlo en la siguiente página.

Sin embargo, creo que si la aplicación se reinicia, el sessionID caducará si no almacena sus sesiones en el servidor sql .

Estoy usando Yahoo Uploader, parte de la biblioteca Yahoo UI, en mi sitio web ASP.Net para permitir a los usuarios subir archivos. Para aquellos que no están familiarizados, el cargador funciona usando un applet Flash para darme más control sobre el diálogo FileOpen. Puedo especificar un filtro para los tipos de archivos, permitir que se seleccionen varios archivos, etc. Es genial, pero tiene la siguiente limitación documentada:

Debido a un error conocido de Flash, el Uploader que se ejecuta en Firefox en Windows no envía las cookies correctas con la carga; en lugar de enviar cookies de Firefox, envía las cookies de Internet Explorer para el dominio respectivo. Como solución, sugerimos utilizar un método de carga sin cookies o anexar document.cookie a la solicitud de carga.

Entonces, si un usuario está usando Firefox, no puedo confiar en que las cookies persistan en su sesión cuando carguen un archivo. ¡Necesito su sesión porque necesito saber quiénes son! Como solución alternativa, estoy utilizando el objeto Aplicación de esta manera:

Guid UploadID = Guid.NewGuid(); Application.Add(Guid.ToString(), User);

Por lo tanto, estoy creando una ID única y usándola como clave para almacenar el objeto Page.User en el ámbito de la Aplicación. Incluyo ese ID como una variable en el POST cuando se carga el archivo. Luego, en el controlador que acepta la carga del archivo, agarro el objeto Usuario de esta manera:

IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];

Esto realmente funciona, pero tiene dos inconvenientes evidentes:

  • Si IIS, el grupo de aplicaciones o incluso solo la aplicación se reinicia entre el momento en que el usuario visita la página de carga y realmente carga un archivo, su "uploadid" se elimina del alcance de la aplicación y la carga falla porque no puedo autenticarlos .

  • Si alguna vez escalo a un escenario de granja web (posiblemente incluso un jardín web), esto se romperá por completo. Puede que no me preocupe, excepto que planeo escalar esta aplicación en el futuro.

¿Alguien tiene una mejor manera? ¿Hay alguna forma de que pase el ID de sesión de ASP.Net real en una variable POST, y luego use esa ID en el otro extremo para recuperar la sesión?

Sé que puedo obtener la ID de sesión a través de Session.SessionID , y sé cómo usar YUI para publicarla en la página siguiente. Lo que no sé es cómo usar ese SessionID para tomar la sesión del servidor de estado.

Sí, estoy usando un servidor de estado para almacenar las sesiones, por lo que persisten los reinicios de aplicaciones / IIS, y funcionarán en un escenario de granja de servidores web.


Puede obtener su SessionID actual desde el siguiente código:

string sessionId = HttpContext.Current.Session.SessionID;

Entonces puede alimentar eso en un campo oculto y luego acceder a ese valor a través de YUI.

Es solo una oportunidad, así que espero que no tenga ningún problema de escala. Sin embargo, hay problemas de seguridad que no sé.


Dependiendo de esta publicación de blog , aquí hay una función que debería proporcionarle la sesión para cualquier usuario basado en la ID de la sesión, aunque no es bonita:

public SessionStateStoreData GetSessionById(string sessionId) { HttpApplication httpApplication = HttpContext.ApplicationInstance; // Black magic #1: getting to SessionStateModule HttpModuleCollection httpModuleCollection = httpApplication.Modules; SessionStateModule sessionHttpModule = httpModuleCollection["Session"] as SessionStateModule; if (sessionHttpModule == null) { // Couldn''t find Session module return null; } // Black magic #2: getting to SessionStateStoreProviderBase through reflection FieldInfo fieldInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.NonPublic | BindingFlags.Instance); SessionStateStoreProviderBase sessionStateStoreProviderBase = fieldInfo.GetValue(sessionHttpModule) as SessionStateStoreProviderBase; if (sessionStateStoreProviderBase == null) { // Couldn''t find sessionStateStoreProviderBase return null; } // Black magic #3: generating dummy HttpContext out of the thin air. sessionStateStoreProviderBase.GetItem in #4 needs it. SimpleWorkerRequest request = new SimpleWorkerRequest("dummy.html", null, new StringWriter()); HttpContext context = new HttpContext(request); // Black magic #4: using sessionStateStoreProviderBase.GetItem to fetch the data from session with given Id. bool locked; TimeSpan lockAge; object lockId; SessionStateActions actions; SessionStateStoreData sessionStateStoreData = sessionStateStoreProviderBase.GetItem( context, sessionId, out locked, out lockAge, out lockId, out actions); return sessionStateStoreData; }


Aquí hay una publicación del mantenedor de SWFUpload que explica cómo cargar la sesión desde una ID almacenada en Request.Form. Me imagino que lo mismo funcionaría para el componente de Yahoo.

Tenga en cuenta las renuncias de seguridad en la parte inferior de la publicación.

Al incluir un archivo Global.asax y el siguiente código, puede anular la cookie de ID de sesión faltante:

using System; using System.Web; public class Global_asax : System.Web.HttpApplication { private void Application_BeginRequest(object sender, EventArgs e) { /* Fix for the Flash Player Cookie bug in Non-IE browsers. Since Flash Player always sends the IE cookies even in FireFox we have to bypass the cookies by sending the values as part of the POST or GET and overwrite the cookies with the passed in values. The theory is that at this point (BeginRequest) the cookies have not been ready by the Session and Authentication logic and if we update the cookies here we''ll get our Session and Authentication restored correctly */ HttpRequest request = HttpContext.Current.Request; try { string sessionParamName = "ASPSESSID"; string sessionCookieName = "ASP.NET_SESSIONID"; string sessionValue = request.Form[sessionParamName] ?? request.QueryString[sessionParamName]; if (sessionValue != null) { UpdateCookie(sessionCookieName, sessionValue); } } catch (Exception ex) { // TODO: Add logging here. } try { string authParamName = "AUTHID"; string authCookieName = FormsAuthentication.FormsCookieName; string authValue = request.Form[authParamName] ?? request.QueryString[authParamName]; if (authValue != null) { UpdateCookie(authCookieName, authValue); } } catch (Exception ex) { // TODO: Add logging here. } } private void UpdateCookie(string cookieName, string cookieValue) { HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookieName); if (cookie == null) { HttpCookie newCookie = new HttpCookie(cookieName, cookieValue); Response.Cookies.Add(newCookie); } else { cookie.Value = cookieValue; HttpContext.Current.Request.Cookies.Set(cookie); } } }

Advertencia de seguridad: no solo copie y pegue este código en su aplicación ASP.Net sin saber lo que está haciendo. Introduce problemas de seguridad y posibilidades de Cross-site Scripting.