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


Автор: no0b 7.11.2013, 09:27
Имеется приложение asp, состоящее из 2-х страниц логин и отчет. Отчет виден только авторизованным пользователям.
Авторизация работает следующим образом:
пользователь вводит логин пароль на страничек логин и жмет ок
в обработчике события приложение обращается в базу 
если логин и пароль верные в сессию записывается что пользователь авторизован
редирект на отчет
отчет проверяет пользователя в сессии если все ок грузим отчет

Вопрос:
Как можно передавать логин и пароль и запускать авторизацию из приложения win forms. Есть способ с передачей логина пароля через строку запроса, мне этот способ кажется не очень безопасным ибо строку эту можно скопировать, к примеру, из истории. Подскажите куда копать?

Автор: jonie 7.11.2013, 10:41
Какой метод авторизации вообще используется?

Подработаю читателем мыслей:
Forms authentification поди? Тогда вам надо всего лишь сделать POST (обычно) запрос с логином и паролем (точно также как делает браузер), получить в ответ с секретными куками и далее эти куки подсовывать в каждый запрос что вы исполняете.
В качестве клиента можно использовать http://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.110%29.aspx
Пример установки кукисов ему: http://stackoverflow.com/questions/12373738/how-do-i-set-a-cookie-on-httpclients-httprequestmessage

Хотя зачастую делают еще дополнительно authenticationService ..

Автор: no0b 7.11.2013, 10:59
Forms authentification буду теперь использовать  smile . Из winforms приложения открывать отчет предполагается вот так:
Код

string link = e.Item.Tag.ToString();
System.Diagnostics.Process.Start(link);


где link это ссылка на страничку с отчетом,  как и куда куки сохранить чтобы открывшийся браузер открыл страничку с уже авторизованным пользователем.

Автор: jonie 8.11.2013, 10:36
Цитата(no0b @  7.11.2013,  11:59 Найти цитируемый пост)
Из winforms приложения открывать отчет предполагается вот так:

ну тогда запускаться будет браузер, стало быть запустить его можно только передав URL туда, где в GET параметрах прошить логин и пароль и правильно эту ситуацию на серверной стороне обработать:
1) если у вас cookie-state аутентификация, тогда сервер увидит что куков нет (предположим что браузер их не содержит), перебросит (http 302) вас при настройках по умолчанию asp.net на страничку авторизации, куда в GET параметре ReturnUrl будет начальный url который вы передали. Из него можно выцепить логин-пароль, обработать в обработчике загрузки страницы и произвести авторизацию и если она успешна вызвать FormsAuthentication.SetAuthCookie и вернув юзеру HTTP 302 с Url-ом, равным GET параметру ReturnUrl. Перейдя по которому браузер отошлёт аутентифкационную куку, система аутентификации сможет аутентифицировать по ней юзера и покажет отчет.

2) если у вас cookie-less аутентификция, тогда можно из WinForms приложения пройти авторизацию (методику я указал), получить идентификатор сессии, который передаётся через GET параметр и уже при запуске браузера в Url подмешивать этот самый идентификатор.

Автор: no0b 8.11.2013, 14:00
Если первым способом то в истории браузера может остаться get запрос с сохраненными логином и паролем?
Второй способ:
в winforms послать get запрос странички логин с параметрами логин пароль  с помощью HttpClient->
в обработчике page_load странички логин, проверить логин и пароль, сгенерить ид отослать его в куках пользователю и  сохранить, в какую то глобальную переменную (типо листа активных сессий)->
на стороне winforms приложения получить из куков ид и открыть (уже в браузере) логин с параметром ид сесии -> 
опять же в page_load логина, проверить ид сесии, если он в листе выданных, то все ок и редирект на отчет. Так? smile 

Автор: jonie 8.11.2013, 19:03
Цитата(no0b @  8.11.2013,  15:00 Найти цитируемый пост)

в winforms послать get запрос странички логин с параметрами логин пароль  с помощью HttpClient-

обыкновенно все же POST используют, но это уже от крисовти рук реализующего..

Цитата(no0b @  8.11.2013,  15:00 Найти цитируемый пост)
в обработчике page_load странички логин, проверить логин и пароль, сгенерить ид отослать его в куках пользователю и  сохранить, в какую то глобальную переменную (типо листа активных сессий)->

не в куках, читайте про cookieless аутентификацию  - она из коробки поддерживается.

Автор: no0b 12.11.2013, 10:28
Сделал аутентификацию описанным мною способом с обычными куками. 
Прием и ответ на post запрос организовал через generic handler.
При пост запросе generic handler принимает логин пароль ищет юзера и создает ид если все ок, который отдает пользователю и записывает в статический лист залогиненных юзеров, юзеру.
После форма логина открывается с параметром этим (временным ид) по нему юзер заходит и стирается он, так что второй раз по нему не зайти. Большое спасибо за инфу!




Автор: jonie 12.11.2013, 17:46
Ну я бы все-таки делал cookieless аутентикацию ... ибо вот это:
Цитата


При пост запросе generic handler принимает логин пароль ищет юзера и создает ид если все ок, который отдает пользователю и записывает в статический лист залогиненных юзеров, юзеру.
 оно как раз и делает (id сессии и её статус).

пример в аттаче

Автор: no0b 13.11.2013, 13:19
Код

if (Session["SUPER_SECRET"] != "42")
        {
            FormsAuthentication.SignOut();
        }

        Session.Abandon();
        base.OnPreLoad(e);


Насчет одноразового доступа в примере, сессия же по ид определяется, который в куках лежит, тогда и сессию толе нужно делать cookieless.

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