WCF - токен аутентификации SSO и интерфейсы POX - PullRequest
2 голосов
/ 26 июля 2010

Вот что я пытаюсь сделать.

У нас есть служба аутентификации SSO, которую другие внешние веб-страницы и службы используют для аутентификации пользователей.Пользователь пытается связаться со службой, если не найдены файлы cookie, содержащие токен аутентификации, они перенаправляются в службу аутентификации SingleSignOn.Служба аутентификации выполняет свою работу и перенаправляет пользователя (HTTP 302) на исходный URL с его зашифрованным токеном аутентификации в URL.Отлично.

Как я могу вызвать это из службы POX WCF?Здесь нет SOAP, просто HTTP GET / POST с XML-ответами.

В настоящее время я выполняю проверку каждого заголовка для файла cookie в каждом методе реализации метода службы.Если файл cookie существует, проверьте токен аутентификации и обработайте запрос.Если файл cookie не существует или токен аутентификации истек, ответьте:

  WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Redirect;
  WebOperationContext.Current.OutgoingResponse.Location = string.Format( authServiceURL, returnURL );

Это работает, но не интегрировано ни с одной из функций WCF и требует от меня ручного кодирования дляцелая куча сценариев.Есть ли способ, которым я мог бы реализовать это с помощью этих классов:

                <serviceCredentials>
                    <issuedTokenAuthentication>
                    </issuedTokenAuthentication>

или использовать некоторые другие средства, которые проверяют каждый запрос к службе?

Я читал страницы, такие как: Как: создать собственный токен , но я не понимаю, как он применим к моим потребностям.

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

1 Ответ

1 голос
/ 24 марта 2011

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

У нас есть служба аутентификации, к которой мы можем перенаправить (Http 301) клиентов, которая будет перенаправлять ихвернуться к нашему сервису после добавления токена аутентификации в URL.Используя это, вот шаги, которые выполняет мой сервис.

Я добавил реализацию System.ServiceModel.ServiceAuthorizationManager и переопределил метод CheckAccessCore, чтобы проверить токен аутентификации либо в файле cookie / заголовке, либо в URL.Если бы я нашел, я бы подтвердил, что токен действителен.Этот метод просто возвращает true или false, указывая, прошел ли запрос аутентификацию или нет.Если сообщение прошло, я создал объект IExtension, содержащий некоторые данные, и добавил его в расширения OperationContext.

Я также добавил реализацию IDispathMessageInspector.Это имеет методы AfterReceiveRequest и BeforeSendReply.Я использовал метод BeforeSendReply, чтобы перехватить ответ.Если сообщение не прошло аутентификацию (у меня не было моего объекта IExtension в расширениях OperationContext), я устанавливаю WebOperationContext.Current.OutgoingResponse.StatusCode для перенаправления, а Location - для URL-адреса службы аутентификации.

Если он прошел аутентификацию, я удостоверился, что токен аутентификации был в файле cookie / заголовке ответного сообщения в методе BeforeSendReply.

Эта статья помогла мне понять, как все это подключить.Это лучший способ?Без понятия.Но это работает для моей службы WCF / REST.Он блокирует все неаутентифицированные сообщения от попадания в мою реализацию ServiceContract, перенаправляя все запросы в службу аутентификации.

...