Потеря переменных сеанса ASP, или я так думаю - PullRequest
0 голосов
/ 22 марта 2011

У меня есть относительно простое приложение ASP.Net, в которое я встроил некоторую упрощенную защиту. Пользователь входит в систему с именем пользователя и паролем, и я проверяю его по БД. В случае успеха я сохраняю для них объект User в переменной сеанса с именем «UserID» и перенаправляю их на ту же страницу, только на этот раз они не видят панель входа в систему. (Ммм может просто скрыть это динамически, но я думаю, что в любом случае это приведет к перезагрузке страницы)

На моей странице Default.aspx у меня есть следующий код:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserID"] == null)
    {
        LoginPanel.Visible = true;
    }
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    Security security = new Security();
    Session["UserID"] = security.LoginUser(txtUsername.Text, txt2Password.Value);
    if (Session["UserID"] != null)
    {                
        Response.Redirect("~/default.aspx");
    }
}

Хорошо, пока все хорошо. Также стоит упомянуть главную страницу:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserID"] == null)
    {
        //Check that we are not already on the default.aspx page.
        //Don't want to cause infinite redirect here
        if (!Request.Path.ToLower().Contains("default.aspx"))
        {
            Page.Response.Redirect("~/Default.aspx");
        }
    }
    else
    {
        //Otherwise we get the UserObject from the session and display menu items           //based on the role. Nothing fancy.

    }


}

//Bad naming. This a logout link on the master...
protected void Unnamed1_Click(object sender, EventArgs e)
{    
    Session["UserID"] = null;
    Page.Response.Redirect("~/Default.aspx");
}

Теперь все это прекрасно работает на моем локальном экземпляре IIS. Как только я разверну это на нашем производственном сервере и нажму на один из пунктов моего меню и перейду, скажем, к Search.aspx, он вернется ко мне на страницу Default.aspx с видимой панелью LoginPanel ??? Также это в Firefox. С помощью IE я могу щелкнуть ссылку меню Search.aspx, и она переместится на страницу, но щелкнув ссылку редактирования в моем GridView, я также вернусь на страницу Default.aspx с отображением LoginPanel.

Я вообще не эксперт по ASP.net и остроумен. Поэтому, пожалуйста, напишите «Ответы» с как можно меньшим жаргоном и т. Д. И опубликуйте ссылки на msdn для документов и так далее, чтобы я не просто решил эту проблему, а понял, почему это вызывает у меня кошмары.

ТИА

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

может быть немного не по теме, но я бы порекомендовал использовать встроенные функции входа в систему, что означает контроль входа, членство и аутентификацию. Тогда вам не нужно связываться с Session

http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx

тогда вы можете сделать Membership.GetUser (). ProviderUserKey, например, чтобы получить ключ

2 голосов
/ 22 марта 2011

Не храните идентификаторы пользователей или другую конфиденциальную информацию в сеансе, вместо этого внедрите IIdentity и IPrincipal с Forms аутентификацией (хотя это не полностью исключает раскрытие информации).

Это обеспечивает легкий доступ к определенным элементам того, что вам нужно:

//to sign-in:
FormsAuthentication.SignIn("username", createPersistentLogin);

//to sign-out:
FormsAuthentication.SignOut();

//user data access:
Page.User.IsInRole("requiredRole");

Page.User.Identity.IsAuthenticated;

Page.User.Name;

Несколько фрагментов из MSDN, чтобы объяснить значение этого:

.NET Framework предоставляет реализация безопасности на основе ролей в System.Security.Principal пространство имен, которое вы можете использовать для авторизация и аутентификация пользователей в вашем приложении.


IIdentity инкапсулирует аутентифицированный пользователь. IPrincipal является сочетание идентичности пользователь и любые роли, которые он или она имеет. Вы может использовать предопределенную идентичность и основные классы в System.Security.Principal пространство имен или Вы можете добавить пользовательскую аутентификацию создание классов, которые реализуют интерфейсы.


Следует соблюдать осторожность при предоставлении разрешения на работу с IIdentity объекты, потому что эти объекты делают конфиденциальная информация о пользователях имеется в наличии. Вы должны защитить текущий IP-принцип приложения объект от изменений, потому что возможность авторизации приложения основано на его текущем принципе.

Вы можете получить информацию об этом из MSDN .

0 голосов
/ 22 марта 2011

Убедитесь, что на вашем рабочем сервере файл Web.Config вашего сайта содержит следующую строку или что-то вроде этого:

<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

Должно быть внутри элемента.

Это проверка того, какую сессиюState вы используете.

Смотрите ссылку: Состояние сеанса Asp.NET

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