Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
4 / 4 / 2
Регистрация: 18.10.2009
Сообщений: 23

Авторизация и аутентификация FormsAuthentication MVC

20.12.2013, 16:12. Показов 3887. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень нужна толковая инструкция по реализации доступа.

На данный момент использую FormsAuthentication по такому принципу:

для входа на сайт нужно отправить в контроллер логин и пароль:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[HttpPost, ActionName("LogOn")]
        public ActionResult LogOn(User model, string returnUrl)
        {
                if (db.GetIn(model.Login,model.Pass,model.RememberMe,Response)!=0) // метод проверки логина и пароля
                {
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    return View(model);
                }
}

вызывается метод контекста, в котором создается FormsAuthenticationTicket и отправляется клиенту :

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
public int GetIn(string strLog, string strPas, Object remme, HttpResponseBase Response)
        {
            if (Users.ToList().Exists(m => (m.Login == strLog) && (m.Pass == strPas))
                && Users.ToList().First(m => (m.Login == strLog) && (m.Pass == strPas)).JobID!=4)
            {
                DateTime Lim = new DateTime();
                if (Convert.ToBoolean(remme)) Lim = DateTime.Now.AddYears(3);
                else Lim = DateTime.Now.AddMinutes(20);
                var authTicket = new System.Web.Security.FormsAuthenticationTicket(
                                    1,                             // version
                                    strLog,                   // user name
                                    DateTime.Now,                  // created
                                    Lim,   // expires
                                    Convert.ToBoolean(remme),              // persistent?
                                    Users.ToList().First(m => (m.Login == strLog) && (m.Pass == strPas)).JobID.ToString()              // возвращает роль пользователя
                                    );
 
                string encryptedTicket = System.Web.Security.FormsAuthentication.Encrypt(authTicket);
 
                var authCookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encryptedTicket);
                Response.Cookies.Add(authCookie);
                return Users.ToList().First(m => (m.Login == strLog) && (m.Pass == strPas)).JobID;
            }
            else
            {
                return 0;
            }
        }

и далее для всех контроллеров проводится проверка подлинности по пропуску:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            
            HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie == null || authCookie.Value == "")
                return;
 
            FormsAuthenticationTicket authTicket;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            }
            catch
            {
                return;
            }
 
            string[] roles = string[] roles = authTicket.UserData.Split(';');
            if (Context.User != null)
                Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
        }

Проблема такова - в пропуске хранится логин и роль. Когда пользователь заходит он буквально говорит сайту, что он администратор и подучает доступ. Если в базе данных удалить пользователя, или изменить его роль, то этот пользователь все равно сможет зайти на сайт и будет иметь права администратора до тех пор, пока не истечёт срок годности кукисов.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.12.2013, 16:12
Ответы с готовыми решениями:

Mvc аутентификация
Доброго времени суток!!! Есть mvc проект version=3,используется аутентификация форм. Есть метод который должен срабатывать даже не для...

Аутентификация в Web Api и Asp.Net MVC 6
Есть задача: Проект на ASP.NET MVC 6 и отдельно проект на Web Api. Нужно сделать аутентификацию. Только встает вопрос каким образом? В...

Windows-аутентификация/авторизация
Добрый день, форумчане. Вопрос следующий. Мне необходимо в разработанном приложении с windows-аутентификацией сделать разграничение...

6
Эксперт .NET
 Аватар для Wolfdp
3785 / 1762 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.12.2013, 15:02
FormsAuthenticationTicket - первый параметр конструктора, это версия "талона". Я бы отталкивался от этого.

P.S. Спасибо, не знал об этой уязвимости.
0
6 / 6 / 0
Регистрация: 29.07.2013
Сообщений: 55
24.12.2013, 18:37
зачем в UserData хранить роль user-а?
если первична БД(ведь каким-то образом пользователь может быть удален из БД?!) - значит нада и опираться на БД, а, скажем, в user name хранить его первичный ключ.
может я, конечно, не о том.
0
Эксперт .NET
 Аватар для Wolfdp
3785 / 1762 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.12.2013, 18:46
Цитата Сообщение от AndreyIvaneneko Посмотреть сообщение
если первична БД(ведь каким-то образом пользователь может быть удален из БД?!) - значит нада и опираться на БД, а, скажем, в user name хранить его первичный ключ.
Не, тут про другое. Например "Ване" нужно выдать на время роль "модератор раздела". То есть в БД его роль поменялась, но в так как уровень доступа завязан на куксах, то для их обновления нужно будет повторно выполнить авторизацию. Тоже самои и при снятии (повторном изменении) прав. В общем, проблема в том, что данныых объект (кукисы) никак не реагирует на изменения в БД.

Что я предлагаю? Где-то ввести глобальную переменную, которая будет получать актуальную версию талонов. В идеале, конечно, это нужно выполнять для каждого пользователя отдельно, но жутко нагрузит БД. (ну или танцы с кэшем)
0
6 / 6 / 0
Регистрация: 29.07.2013
Сообщений: 55
24.12.2013, 19:31
все равно не понял зачем хранить роль в userdata..
если хранить в куках такую(динамическую и важную) информацию - это, как по-мне, неправильно. это не проблема куков - это проблема такой модели.
если доступ к пользователям только через одно горло(сайт, сервисы) можно на этом уровне хранить пользователей в каком нить статитке(если помещаются), если нет, вероятно только в базе. если много асинхронных запросов - думаю можно еще как-то оптимизировать.
0
Эксперт .NET
 Аватар для Wolfdp
3785 / 1762 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.12.2013, 19:39
Цитата Сообщение от AndreyIvaneneko Посмотреть сообщение
все равно не понял зачем хранить роль в userdata..
Её довольно просто туда запихнуть. XD
Цитата Сообщение от AndreyIvaneneko Посмотреть сообщение
это проблема такой модели.
Я тут на днях, в контексте самообучению MVC, писал довольно веселый велосипед: кастомная авторизация. Увидив в одном проекте такую прикольную вещь как "permissions" решил попробовать реализовать у себя. То есть у нас теперь даже не одна единственная роль должна где-то хранится, а целый список. Решил особо не парится и засунуть в сессию. Если в сесси нет, подтягивает из БД. Вот сижу и думаю теперь: насколько же это "не найс"? >_<
0
6 / 6 / 0
Регистрация: 29.07.2013
Сообщений: 55
25.12.2013, 13:06
я б не сказал, что это просто - последствия такой простоты тому подтверждение.
по поводу использования сессии(изменения) - проблем с асинхронными запрсами не возникает(ajax какой)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2013, 13:06
Помогаю со студенческими работами здесь

Авторизация и аутентификация
Всем привет! Ребят нужна помощь. Я сам очень новичок, но таки элементарную регистрацию и авторизацию сделал. Вот код:регистрации: ...

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

Аутентификация и авторизация
Доброго времени суток! Есть приложение, написанное на Qt, которое работает с удаленной БД. Возникла идея реализовать аутентификацию, с...

авторизация и аутентификация
подскажите пожалуйста подробно =))) чем отличается аутентификация пользователя от авторизации

Идентификация, аутентификация и авторизация
Ни как не могу найти где это: Кто знает где это искать в Windows XP?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru