C # Cookies на основе информации для входа - PullRequest
1 голос
/ 16 сентября 2010

У меня есть 2 элемента управления входом в веб-приложение, одно по умолчанию и одно по умолчанию2 (соглашение об именах будет обновлено после того, как я его заработаю).

Что я делаю, это устанавливаю cookie для каждого входа в системуэто отправит имя строки подключения из метода проверки подлинности элементов управления входом в систему.Он отправляет строку, которая жестко запрограммирована в базовый класс с именем Authenticate Users.Класс делает следующее ...

public class AuthenticatedUser : System.Web.UI.Page
{
public static string ConnectionString
{
    get
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
        return GetConnectionStringFromName(myCookie);
    }
    set
    {
        HttpCookie oldCookie = HttpContext.Current.Request.Cookies["connectionString"];
        oldCookie.Expires = DateTime.Now.AddDays(-1);
        HttpCookie cookie = new HttpCookie("connectionString");
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Request.Cookies.Add(cookie);
        string val = cookie.Value;
    }
}

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

}

Я пропускаю строки "database1" и "database2" в зависимости от того, какой контроль входа они используют.Когда я отлаживаю код, строка соединения устанавливает всю информацию о cookie, и все отлично работает для «database2», однако каждый раз, когда я вхожу в систему, используя форму, связанную с «database1», он устанавливает cookie, но когда вызывается get, он все ещессылка на "database2"

Является ли это проблемой, поскольку файлы cookie имеют одинаковые имена и не перезаписывают друг друга и не обновляются, или есть проблема с моим кодом?

edit - это все ещене работает с удалением файлов cookie из контекста, он все еще дает мне «database2», когда я запускаю «database1»

 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);
        }
        HttpCookie cookie = HttpContext.Current.Response.Cookies["connectionString"];
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Response.Cookies.Add(cookie);
        string val = cookie.Value;
    }
}

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.Response.Cookies.Remove(cook.Name);
    }
} 

Final Edit. Это работает ... вот рабочий код, если кому-то интересно...

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);
        string val = cookie.Value;
    }
}

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 = "";
    }
} 

1 Ответ

1 голос
/ 16 сентября 2010

у вас есть часть кода, необходимого (истекает cookie).но вам также нужно удалить из контекста, попробуйте что-то вроде следующего:

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.Response.Cookies.Remove(cook.Name);
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...