Проверка подлинности на основе токенов в WCF - PullRequest
5 голосов
/ 07 декабря 2009

Я создаю веб-сайт, который будет содержать как страницы ASP.NET, так и апплет Flash. Я хочу инкапсулировать свою бизнес-логику в службу WCF, которая будет доступна через две конечные точки: одну, доступную через Интернет через HTTP (S), для использования клиентом Flash, и одну, доступную в центре обработки данных для использования серверами приложений. , Если это не похоже на хороший подход, остановите меня здесь; в противном случае я буду двигаться дальше ...

Вопрос в том, как аутентифицировать запросы, поступающие от клиента Flash. Поскольку я не хочу хранить пароль пользователя в файле cookie браузера, не хочу отправлять пароль при каждом запросе и не хочу использовать HTTPS после первоначального входа в систему, я планирую использовать токен. Система аутентификации на основе. Я также не хочу, чтобы пользователю приходилось входить в клиент Flash после того, как он уже вошел на сам сайт, поэтому я планирую использовать Javascript для передачи токена клиенту Flash при его запуске.

Я знаю, что WCF поддерживает использование встроенной инфраструктуры безопасности .NET Framework (System.Security) для обеспечения контроля доступа, и я хотел бы воспользоваться этим.

Тогда возникает вопрос: Как передать токен службе WCF, когда он вызывается Flash, и как мне обработать токен на сервере?

  • В WCF есть режим аутентификации «выданный токен», но, похоже, он предназначен для использования в полномасштабном сценарии федерации с Secure Token Service и токенами SAML - немного сложнее, чем я действительно хочу. Можно ли использовать этот режим с моими собственными "простыми случайными строковыми" токенами? Если так, то как? Имейте в виду, что это должно быть совместимо с Flash.
  • Я мог бы передать токен в заголовке (заголовок SOAP или заголовок HTTP). В этом случае, после того как я определил, какой пользователь делает запрос, как мне сообщить платформе, чтобы проверки System.Security работали?
  • Есть ли другой подход, который я должен рассмотреть? Все, что позволяет избежать отправки паролей при каждом запросе, позволяет мне использовать System.Security и работает с Flash.

1 Ответ

2 голосов
/ 31 марта 2011

Поскольку кажется, что на первоначальный вопрос был дан ответ, я буду кратким, но один из подходов действительно состоит в том, чтобы передать маркер аутентификации в заголовке http и переопределить CheckAccess(OperationContext operationContext, ref Message message) в пользовательском ServiceAuthorizationManager.

Ранее вы настроили службу для использования настраиваемой политики, реализующей IAuthorizationPolicy.

Осталось реализовать простые классы IIdentity и IPrincipal для хранения вашего состояния авторизации.

На эту тему существует множество хороших статей:

http://msdn.microsoft.com/en-us/library/system.identitymodel.policy.iauthorizationpolicy.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthorizationmanager.aspx

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

...