Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Разграничение прав


Автор: D_EMO_N 3.1.2008, 17:58
Подскажите как на сайт при добавить проверку пользователя при загрузке каждойстраницы?
Суть проблемы заключается в том что есть некая БД, зависимая от сайта. Когда пользователь логинится его проверяют на тот какие у него права, потом ему видны соответсвующие разделы сайта. Но разделы при отображении в строке адреса прописываются с соотв ID, и если пользователь просто поменяет ID в стране адреса то он увидит аналогичную страницу но с другим содержимым. я так понял, что страница заполняется данными в соотв с тем какой ИД стоит в адресе. Но при этом пользователь может производить все манипуляции с этой страницей так, как будто он залогинился с соотв. полномочиями.

ЗЫ. Всех поздравляю с Новым Годом, всем всего наилучшего, успехов и карьерного роста.

Автор: Mymik 4.1.2008, 10:04
Предлагаю поставить в Application_BeginRequest проверку на полномочия пользователя. Т.е. поставить там проверку, мол если пользователь залогинен, то проверять из какой он страны и если страна не совпадает с адресной строкой, то кидать его на специальную страницу типа "YouStupidHacker.aspx"  с текстом "Простите, вы из другой страны" smile

Автор: D_EMO_N 4.1.2008, 11:00
Вопрос решил, почитав немного и поспрашивав. И я вопрос не корректно задал:
Есть БД с организациями(можно и странами), организации имеют иерархическую структуру, есть пользователи которые могут иметь доступ только к этой организации(если она является самой низжей в дереве организаций) или к этой и её потомкам.
Мое решение выглядит следующим образом: залогинившийся пользователь принадлежит к какой-то орг., эта орг. имеет левый и правый индекс, соотв индекс её детей будет находиться в промежутке между левым и правым индексом этой орг. Т.е. при запросе пользователя отобразить страницу (просто в адресе поменял цифру) будет проверять можно ли отобразить или нет. 

А вот где можно почитать как это сделать?
Как определяется пользователь я не знаю так как сайт без *.cs файлов, ои все в dll скомпилены.

Автор: Mymik 4.1.2008, 11:17
Если все в Dll то уже никак :(... ну точнее открываешь http://www.aisto.com/roeder/dotnet/ открываешь им dll и смотришь исходный код smile. А дальше copy/past с доработкой кода.
А можешь унаследоваться от нужного тебе класса, переопределить немного Page_Load (ихний код из рефлектора, плюс свой дописать)

А вообще я думаю, что лучший способ это в Application_BeginRequest засунуть проверку.

Автор: D_EMO_N 4.1.2008, 11:47
за Reflector спасибо.
По поводу проверки - где узнать как это делается? Я только начинаю программированием заниматься.
Ну вот благодаря рефлектору у меня есть доступ к исходным кодам, а где там узнать как проверяется пользователь?

Код

        <authentication mode="Forms">
            <forms loginUrl="Login.aspx"/>
        </authentication>

из web.config

Код

        protected void Page_Load(object sender, System.EventArgs e)
        {
            if (Request.IsAuthenticated)
                Response.Redirect("~/Default.aspx");
            // Put user code to initialize the page here
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {    

        }
        #endregion

        


        protected void btnSignIn_Click(object sender, System.EventArgs e)
        {
            if (Page.IsValid) 
            {
                if (SecUser.Authenticate(txtUsername.Text, txtPassword.Text))
                    FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, chkRemember.Checked );
                else
                    lblError.Text = "Invalid username or password";
            }
        
        }

код из файла логина, но про то как именно сопоставляет пароль\логин пользователя с БД не нашел... но в БД есть этот пользователь, приписанный к орг. как вытащить эту строчку? 
что-то наподобие выбор этого параметра где пользователь=@текущий, вот как определить текущего?

Автор: Mymik 4.1.2008, 21:23
текущий пользователь храниться в 
Код

HttpContext.Current.User.Identity.Name

А вообще, скорее всего там используется membership... его можно найти в web.config там он одноименной сексии указывается где хранится этот провайдер. Ну а дальше опять лазь и смотри. НО. Это не дело переписывать такую громоздкую систему. Попроси чтобы тебе дали исходный код, либо напиши свой провайдер.

Цитата(D_EMO_N @  4.1.2008,  11:47 Найти цитируемый пост)
Я только начинаю программированием заниматься.

сложно тебе прийдется :(

Автор: tol05 4.1.2008, 22:19
D_EMO_N, 
Цитата(D_EMO_N @  4.1.2008,  10:47 Найти цитируемый пост)
о про то как именно сопоставляет пароль\логин пользователя с БД не нашел...

у тебя есть строка 
Код

if (SecUser.Authenticate(txtUsername.Text, txtPassword.Text)) FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, chkRemember.Checked );
перевожу на русский: "Если функция Authenticate() класса SecUser скажет, что юзер с именем из txtUsername.Text и паролем из txtPassword.Text аутентифицирован, то перенаправить его с логин-страницы на ту, что он просит". При этом имя юзера и флаг (делать кук или нет, т.е. Remember или не Remember) передать в FormsAuthentication.RedirectFromLoginPage... Читай про нее в msdn.

функция Authenticate() класса SecUser скорее всего и лезет в базу за информацией. Копай ее рефлектором.


Цитата(Mymik @  4.1.2008,  20:23 Найти цитируемый пост)

Цитата(D_EMO_N @  4.1.2008,  11:47 Найти цитируемый пост)
Я только начинаю программированием заниматься.

сложно тебе прийдется :( 


мда... не то слово.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)