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


Аутентификация - часть 2


ToString()); //Создаем сессию на Web-сервере SecurityContextContainer.GetInstance()[context.SessionID] = context; } break; }

Во время выполнения запроса _nextSink.ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream);

управление передается на сервер приложения, где в работу первым делом включается серверный канальный приемник ServerChannelSink, а именно, его метод ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) //Получаем идентификатор сессии из заголовков запроса string SID = (string)requestHeaders[ChannelSinkHeaders.SID_HEADER]; ServerSecurityContext context = null; if (SID == null) //Если SID отсутствует, пробуем аутентифицировать запрос { //Пробуем получить логин и пароль из заголовков запроса string userName = (string)requestHeaders[ChannelSinkHeaders.USER_NAME_HEADER]; string password = (string)requestHeaders[ChannelSinkHeaders.PASSWORD_HEADER]; AuthenticationStates authResult = AuthenticationStates.NotAuthenticated; if ((userName != null) && (password != null)) { //Если логин и пароль найдены, выполняем аутентификацию string roles; authResult = Authenticate(userName,password, out roles); switch (authResult) { case AuthenticationStates.Authenticated: //Аутентификация прошла успешно //Создаем серверный контекст для пользователя context = new ServerSecurityContext(userName,roles); context.SetAuthState(AuthenticationStates.Authenticated); //Создаем сессию на сервере приложения SecurityContextContainer.GetInstance()[context.SessionID]= context; break; default: //Аутентификация не удалась. throw new System.Security.SecurityException("Authentication failed"); } } } //Если SID существует в заголовках запроса, то авторизируем запрос //по этому SID else { //Воостанавливаем сессию по ее идентификатору context = (ServerSecurityContext)SecurityContextContainer.GetInstance()[SID]; if (context == null) { throw new System.Security.SecurityException("Authorization failed"); } else { //Ассоциируем текущий контекст с полученным по SID ServerSecurityContext.Current = context; } } System.Security.Principal.IPrincipal orginalPrincipal = Thread.CurrentPrincipal; if (ServerSecurityContext.Current != null) { //Ассоциируем Principal текущего потока с //Principal объектом контекста Thread.CurrentPrincipal = ServerSecurityContext.Current.Principal; } sinkStack.Push(this, null); ServerProcessing processing; //Выполняем полученный запрос на сервере приложения processing = _nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); sinkStack.Pop(this); //Восстанавливаем Principal объект для потока Thread.CurrentPrincipal = orginalPrincipal; AuthenticationStates serverAuthState = AuthenticationStates.NotAuthenticated; if (ServerSecurityContext.Current != null) serverAuthState = context.AuthState; responseHeaders = new TransportHeaders(); switch (serverAuthState) { case AuthenticationStates.Authenticated: //Если аутентификация прошла успешно, //выставляем заголовки для отправки на Web-сервер responseHeaders[ChannelSinkHeaders.AUTH_STATE_HEADER] = AuthenticationStates.Authenticated; responseHeaders[ChannelSinkHeaders.SID_HEADER] = ServerSecurityContext.Current.SessionID; responseHeaders[ChannelSinkHeaders.ROLES_HEADER] = ServerSecurityContext.Current.Roles; break; default : responseHeaders[ChannelSinkHeaders.AUTH_STATE_HEADER]= serverAuthState; break; } //Очищаем текущий контекст ServerSecurityContext.Current = null; //Возвращаем управление и результаты запроса в //клиентский канальный приемник return ServerProcessing.Complete;

Теперь пользователь аутентифицирован и может работать с ИС.


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