Средства разработки приложений


Аутентификация


На рисунке 6 изображен сценарий первичной аутентификации пользователя в ИС.

Рисунок 6.

Пользователь вводит логин и пароль в Web-форме. Обработчик отправки формы пытается выполнить аутентификацию: // Создаем контекст для аутентификации. // Цель: привязать к текущему потоку выполнения // аутентификационные данные, // чтобы иметь к ним доступ из клиентского канального приемника ClientSecurityContext context = new ClientSecurityContext(tbName.Text,tbPassword.Text); try { // Обращаемся к серверу приложения userData = (new RemotingExample.BusinessFacade.SomeSystem()). GetUserData(); } catch (System.Security.SecurityException ex) { //Аутентификация на сервере приложения прошла неудачно this.lblMessage.Text = ex.Message; return; } //Аутентификация удалась //Создаем и записываем пользователю в Cookie билет аутентификации. SetAuthTiket(tbName.Text, context.SessionID);

Но это только надводная часть айсберга, который называется аутентификацией. Все самое интересное происходит, когда начинают работать механизмы Remoting, а именно - клиентский и серверный канальные приемники.

Когда мы создаем контекст для аутентификации, мы готовим тем самым поле деятельности для клиентского канального приемника - ClientChannelSink, который и будет выполнять всю работу по аутентификации клиента на сервере приложения.

После вызова удаленного метода: userData = (new RemotingExample.BusinessFacade.SomeSystem()).GetUserData();

управление получает клиентский канальный применик ClientChannelSink, а именно его метод : public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) //Вытаскиваем контекст запроса ClientSecurityContext context = ClientSecurityContext.Current; //Проверяем, аутентифицирован ли контекст switch (context.AuthState) { case AuthenticationStates.Authenticated: //Если аутентифицирован, то добавляем в заголовки запроса //к серверу приложения SID контекста requestHeaders[ChannelSinkHeaders.SID_HEADER] = context.SessionID; break; default : //Иначе добавляем логин и пароль requestHeaders[ChannelSinkHeaders.USER_NAME_HEADER] = context.Login; requestHeaders[ChannelSinkHeaders.PASSWORD_HEADER] = сontext.Password; break; } //Выполняем запрос на сервер приложения _nextSink.ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream); AuthenticationStates serverAuth = AuthenticationStates.NotAuthenticated; //Получаем заголовок состояния аутентификации сервера приложения string serverAuthHeader = (string)responseHeaders[ChannelSinkHeaders.AUTH_STATE_HEADER]; //Анализируем полученный заголовок switch (serverAuth) { //Контекст аутентифицирован на сервере приложения case AuthenticationStates.Authenticated: if (context.AuthState != AuthenticationStates.Authenticated) { //На Web-сервере контекст еще не аутентифицирован //Создаем Principal объект для контекста string roles = responseHeaders[ChannelSinkHeaders.ROLES_HEADER].ToString(); string[] rolesArr = roles.Split(new char[]{','}); IIdentity identity=new GenericIdentity(ClientSecurityContext.Current.Login); IPrincipal userPrincipal = new GenericPrincipal(identity,rolesArr); //Аутентифицируем контекст context.SetAuthState(AuthenticationStates.Authenticated); context.SetPrincipal(userPrincipal); //Устанавливаем идентификатор сессии context.SetSessionID(responseHeaders[ChannelSinkHeaders.SID_HEADER].


Начало  Назад  Вперед