Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 24.04.2015
Сообщений: 132
1

Трёхзвенная архитектура (Авторизация)

03.11.2016, 21:33. Показов 1716. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем мне нужно сделать так,чтобы я смог авторизоваться и программа подгрузила мою аватарку , ник и тд.
Я это пытаюсь реализовать с помощью Сессий.
Я передаю через клиента логин и пароль серверу,если они верны я записываю в новую таблицу сессию и логин,к которому подходит эта сессия.Сессия на стороне клиента и БД совпадает.Но вот как организовать авторизацию я не понимаю.
Реализация
--------
На стороне Сервера
--------
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 void IInoService.Authentication(string Login, string Password)
        {
            try
            {
                SqlDataAdapter sda = new SqlDataAdapter("SELECT Login,Password FROM users WHERE login ='" + Login + "'and Password ='" + Password + "'", Connection);
                DataTable dt = new DataTable();
                Connection.Open();
                sda.Fill(dt);
                Connection.Close();
                if (dt.Rows.Count == 1) ///если пароль и логин верны записываю в БД логин и сессию
                {
                    var sid = OperationContext.Current.SessionId;
                    Connection.Open();
                    SqlCommand sqlcommand = new SqlCommand("INSERT INTO GUID(GUID,Login) VALUES (@GUID,@Login)", Connection);
                    sqlcommand.Parameters.AddWithValue("@GUID", sid);
                    sqlcommand.Parameters.AddWithValue("@Login", Login);
                    sqlcommand.ExecuteNonQuery();
                }
            }
           finally { Connection.Close(); }
        }
---------
На стороне клиента
---------
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void AutButton_Click(object sender, EventArgs e)
        {
            try
            { 
                var client = new InoService.InoServiceClient("NetTcpBinding_IInoService"); ///создаю клиента
                client.Authentication(LoginA.Text, PasswordA.Text); ///передаю логин и пароль на сервер
                client.Close();
                Text = client.InnerChannel.SessionId;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
Как видно , сессии совпадают,но я не очень понимаю как их в дальнейшем использовать для авторизации,ведь с помощью методов проверку устроить нельзя через условие
Миниатюры
Трёхзвенная архитектура (Авторизация)   Трёхзвенная архитектура (Авторизация)  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2016, 21:33
Ответы с готовыми решениями:

Трехзвенная архитектура: БД SQL + сервер + клиент (WPF)
В общем нужно реализовать трёхзвуенную архитектуру . Чтобы клент отправлял запрос на сервер,сервер...

Трехзвенная архитектура: Бд (Access) + сервер (win form) + клиент (wpf)
В общем нужно реализовать трехзвенку (БД (Access) + Сервер (Win Form) + Клиент (WPF)). Сервер...

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и...

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

6
0 / 0 / 1
Регистрация: 24.04.2015
Сообщений: 132
04.11.2016, 16:43  [ТС] 2
Сделал еще переход к новой форме,но на новую форму не распространяется сессия,как то можно на новую форму добавить уже полученную сессию ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private void AutButton_Click(object sender, EventArgs e)
        {
            try
            { 
                var client = new InoService.InoServiceClient("NetTcpBinding_IInoService");
                client.Authentication(LoginA.Text, PasswordA.Text);
                client.Close();
                Text = client.InnerChannel.SessionId;
                SqlDataAdapter sda = new SqlDataAdapter("SELECT Login,Password FROM users WHERE login ='" + LoginA.Text + "'and Password ='" + PasswordA.Text + "'", Connection);
                DataTable dt = new DataTable();
                Connection.Open();
                sda.Fill(dt);
                Connection.Close();
                if (dt.Rows.Count == 1)
                {
                    this.Hide();
                    Form2 GotoForm2 = new Form2();
                    GotoForm2.ShowDialog();
                    
                }
                else
                {
                    MessageBox.Show("Неправильно введены данные");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.11.2016, 19:10 3
Цитата Сообщение от Inomezi Посмотреть сообщение
ведь с помощью методов проверку устроить нельзя через условие
Как это нельзя? Во все методы, которые вы вызываете на сервере вы должны передавать номер сессии. Сервер проверяет номер сессии, и если он существует получает имя клиента, который прислал запрос. И отправляет обратно клиенту данные (например его автарку).
Цитата Сообщение от Inomezi Посмотреть сообщение
Сделал еще переход к новой форме,но на новую форму не распространяется сессия,как то можно на новую форму добавить уже полученную сессию ?
Соpдайте статический класс (например CurrenUser). При авторизации, занесите в этот класс номер сессии. При запросах с других форм - берите номер сессии из статического класса.
Цитата Сообщение от Inomezi Посмотреть сообщение
SqlDataAdapter sda = new SqlDataAdapter("SELECT Login,Password FROM users WHERE login ='" + LoginA.Text + "'and Password ='" + PasswordA.Text + "'", Connection);
В трехзвенной архитектуре не может быть прямых обращений к базе данных из клиентского приложения.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
06.11.2016, 20:14 4
Цитата Сообщение от Storm23 Посмотреть сообщение
Во все методы, которые вы вызываете на сервере вы должны передавать номер сессии
Storm23, ятд, отвратительный подход. В принципе, можно с таким же успехом передавать объект User с полями имени и пароля. И так каждый метод, согласитесь, довольно накладно.
С другой стороны, в WCF есть отличный механизм авторизации (о чем я ТС и говорил в другой теме), но он, очевидно, не хочет использовать то, что уже есть, а предпочитает велосипедить. Зря, все уже разработано, из коробки. Бери и пользуйся.
Можно и сильнее поизощряться (через реализацию собственных поведений), но тут это ни к чему. Просто используем заложенные в WCF возможности и все.
0
Storm23
06.11.2016, 20:45
  #5

Не по теме:

Цитата Сообщение от insite2012 Посмотреть сообщение
не хочет использовать то, что уже есть, а предпочитает велосипедить
А я люблю велосипедить. :)
А если все брать из коробки, то вы станете коробочным программистом :p

0
insite2012
06.11.2016, 20:52
  #6

Не по теме:

Storm23, я тоже иногда люблю. И даже делал примерно так, как и сказал (передавал объект типа User для проверки в каждом методе). Но потом надоело, засоряется код тем, что к делу не относится. :)

0
0 / 0 / 1
Регистрация: 24.04.2015
Сообщений: 132
07.11.2016, 11:22  [ТС] 7
Storm23,
Цитата Сообщение от Storm23 Посмотреть сообщение
В трехзвенной архитектуре не может быть прямых обращений к базе данных из клиентского приложения.
Я проверку данных делаю на сервере,а когда сервер проверил логин и пароль я возвращаю номер сессии ,и делаю еще одну проверку на стороне клиента для перехода к новой форме,ведь сервер не может перенаправить мой клиент на след. форму (или я просто не знаю как это сделать,если это возможно)
insite2012,
На момент создания этой темы я еще не видел вашего совета,я сегодня посмотрю пример что вы мне дали,и попробую так как вы говорили
0
07.11.2016, 11:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2016, 11:22
Помогаю со студенческими работами здесь

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку "Проверить соединение" Я прочитал, что это возможно из за...

Архитектура 1С
ребята, подскажите может кто знает архитектуру 1С предприятие 8.2.. как расписать это..

Архитектура БД
Уважаемые пользователи, наш dba слег в больничку, возникла срочная задача , которую руководство...

Архитектура.
Подскажите среду для UML моделирования, которая адекватно печатает диаграмму классов и литературу...

Архитектура
Вот скажите как правильно это сделать(Знаю нужно читать книгу про MVC , смотреть готовые фраемворки...

Архитектура
Всем добрый вечер! Возник такой вопрос. Как лучше из одного класса получить данные другого класса....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru