Как сделать GridView в asp.net webforms ориентированной на пользователя?
На данный момент располагаю веб приложением, которое использует 1 бухгалтерша. Т.е. логина, регистрации итд, ничего подобного нету.
Сейчас появилась потребность сделать это приложение ориентированное на приличное кол-во пользователей. И вот вопрос в следующем: Как реализовать лучше всего все это в asp.net, c#, mssql так, чтобы каждый пользователь видел только свои данные в соответствующих таблицах?
Пока что думал только о таком варианте: Создать базу юзеров, логин, регу это понятное дело)) Изменить процедуры insert на добавление доп. поля с текущим пользователем. В последствии при заходе на страничку делать select комманду где user = CurrentUser.
- Если это правильный подход, то как узнать потом этого текущего юзера?
- Если же это полный бред, то хотелось бы почитать о правильном варианте))
В инете не проблема найти гайды для логина, регистрации, самим таблицам по асп.нету, а вот именно их работа вместе как-то глушь :(
С webforms не работал, но мне кажется от winform не сильно отличается, по этому я посоветовал бы сделать так:
- После авторизации кидаем запрос в БД с логином авторизованного (пример: Select id_user, FirstName, Surname from Users where user = CurrentUser)
- Из временной таблицы (сделать ее невидимой) достаем всю необходимую инфу (пример: 2594, Семен, Иванов)
- Подгружаем на страницу или в переменные
пример моей реализации из WinForm: https://yadi.sk/i/kDwbitqlhPzoM
CurrentUser подтягиваю из поля "Логин" после чего шлю в БД следующий запрос: Select id_User from User where Login='" + CurrentUser.text + "' and Password=(" + password + ")
password - записан хеш функцией из поля "пароль"
после чего id_User записываю в переменную и в случае чего юзаю ее.
Данной прогой пользуются более 90 человек, на авторизации "дыр" не наблюдалось...
В ближайшее время думаю обновить авторизацию до ЭЦП или хотя бы до сертификатов
Иван: ясненько, я так понимаю решений много. Еще 1 маленький вопрос, а как именно вы подтягиваете каррентюзера из логина?
А так у меня реализация (еще никакая) :) Хотя единственное, что я хорошо умею делать это работа с базами и таблицами такими. с# у меня как "загуглю или пойду на***.... Так что я решил сделать 2 варианта, 1 логина как во "многочисленных гайдах на ютубах", а другой как админскую панель с GridView и Detailsview.
Кстати только сейчас вспомнил такую вещь... У меня то там не 1 приложение, а целых 3 ) Но они не большие, на каждое из них по 1 aspx i aspx.cs фаилу. Что же если мне надо это сделать для всех таблиц? После логина отсылать айди на все 3 приложения и на всех 3 ловить его?
Алгоритм такой:
- При загрузке формы, подтягиваю в ComboBox все логины пользователей, запросом Select Login from User;
- Пользователь выбирает из ComboBox'а свой логин
- Вводит пароль
- Нажимает кнопку "Вход"
- Идет проверка пароля и логина на валидность, если логин и хеш пароля совпадают то переходим к следующему шагу
- После чего отправляем команду запроса id пользователя: Select id_User from User where Login='" + CurrentUser.text + "' and Password=(" + password + ");
- При получении id пользователя пишем его в глобальную переменную
При необходимости id пользователя можно передавать другим формам.
Моя реализация:
В программе реализовано 3 модуля для разных групп пользователей (3 разных формы и функционала: Договоры, Входящие документы, Финансовые документы) при авторизации, передаю id пользователя в нужную форму для дальнейшей работы с БД.
Возможно не правильно понял твой вопрос... если что то не то написал пиши подскажу...
Иван: сегодня в бюро короче написал все как надо)) Создал функцию, которая берет мыло и пароль в SQLе через Сторед процедуру и возвращает DavaView, которое я уже юзаю в OnButtonClick, сохраняя там в Session и на PageLoad делаю проверку в MasterPage, чтобы Session[xx] == 1, иначе возврат к логину) И на основе Сешн-нейма можно уже делать дальнейшие манипуляции.
не понятно на чем крутится база, но я бы сделал так: в БД завести отдельную табличку "users": Login, PassHash, ID
в исходной таблице соответственно добавить столбец UserID в котором соответсвенный ID пользователя
При авторизации делать селект в таблицу с пользователями и получать ID
при запросе в исходную таблицу добавить еще 1 where ID=ВашID
это решение простое, но оно не безопасно и для критичных данных его использовать нельзя.
При логине да, это в принципе реально, сделать редикт заходящего юзера на другую страницу и там его поймать, но это на 1 раз, каждое действие в таблице, делает новый селект, а вот там то уже этого ID не будет как изначально. ВОт основная проблема это уже при дальнейшей работе с таблицами, чтобы брался актуальный ID активного юзера. И да все-таки безопасность лишней тоже не будет. Все таки данные с различными счетами, заказами, информацией о фирмах.
Therapyx: не совсем ясно, вы что при каждом обновлении таблицы перегружаете всю страницу? WebForms как бы позволяет удерживать переменную в памяти на время сеанса. Редирект нужен только 1 раз при переходе с страницы авторизации.
А хотя все верно, у меня там просто есть уже подобный пример в проекте, ничего не сбрасывается)) В каждой колонке от gridview есть кнопка, которая берет из этого столбца все данные и как айдишку со всей информацией пересылает на другую страницу, забивая поля счета для печати.
Такой вариант покатит :) Спасибо, что-то ночью совсем мысли покинули меня