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