WCF - токен аутентификации SSO и интерфейсы POX

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

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

Как я могу вызвать это из службы WCF POX? Здесь нет 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 ответ

Решение

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

У нас есть служба аутентификации, к которой мы можем перенаправить клиентов (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, перенаправляя все запросы в службу аутентификации.

Другие вопросы по тегам