Pregunta

Scenerio - Estoy escribí una aplicación web que basa fuera de las cuales cuadro de inicio de sesión que utiliza (database1 y database2) que se conectará a la base de datos cooresponding. He puesto el web.config para sostener ambas cadenas de conexión. En el método On_Authenticate de cada caja puedo comprobar para autenticar al usuario y luego enviar una cadena basada en la casilla de ingreso a una variable pública en una clase llamada Autenticación del usuario. Este públicas cheques variables para la cookie y recibe el nombre de cadena de conexión de la variable, si la cookie es nulo, se establece una nueva cookie expira todas las cookies existentes y establece los valores de las cookies.

Ahora, una vez hecho esto, cada vez que me golpeó la base de datos (usando LINQ2SQL) creo un DataContext y enviar AuthenticatedUser.ConnectionString. Esto comprobará la cookie y enviarlo obtener la cadena de conexión para utilizar para extraer los datos. Herer es la clase AuthenticatedUser ...

public class AuthenticatedUser : System.Web.UI.Page
{
public static string ConnectionString
{
    get
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
        return GetConnectionStringFromName(myCookie);
    }
    set
    {
        if (HttpContext.Current.Request.Cookies["connectionString"] != null)
        {
            ExpireCookies(HttpContext.Current);
        }
        var allCookies = HttpContext.Current.Request.Cookies.AllKeys;
        HttpCookie cookie = new HttpCookie("connectionString");
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Request.Cookies.Add(cookie);
    }
}

private static string GetConnectionStringFromName(HttpCookie myCookie)
{
    string connectionStringName = myCookie.Value;
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}

private static void ExpireCookies(HttpContext current)
{
    var allCookies = current.Request.Cookies.AllKeys;
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null))
    {
        cook.Value = "";
        cook.Expires = DateTime.Now.AddDays(-1);
        current.Request.Cookies.Remove(cook.Name);
        cook.Name = "";
    }
} 

}

Ahora bien, esto parece estar trabajando en la primera posición desde el inicio de sesión. Cuando escribo en la información del usuario y yo paso por el proceso que puedo ver la cookie que se establece / Sin embargo, en el primer verdadero llamado de base de datos donde uso PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); estoy recibiendo un error de referencia nula. Por la que atraviesa el Get y comprueba la cookie y devuelve una cookie nula. Lo que podría estar sucediendo aquí?

¿Fue útil?

Solución

Es necesario añadir la cookie a la colección Response.Cookies al establecer que en lugar de la colección Request.Cookies. Sólo las cookies en la respuesta se envían de vuelta al navegador del usuario.

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