2012-03-14 3 views
2

Мне нужно разместить бизнес-логику приложения в службе WCF. Служба не должна зависеть от ASP.NET, и есть много данных об аутентифицированном пользователе, который часто используется в бизнес-логике, поэтому он должен быть кэширован (возможно, с использованием распределенного кеша). Что касается проверки подлинности - я собираюсь использовать два уровень проверки подлинности:asp.net, аутентификация и кэширование wcf

  1. Front-End - форма аутентификации фоновых
  2. (WCF Service) - сообщение аутентификации имени пользователя.

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

1) Аутентифицировать - будет получать необходимые данные и поместить их в кэш (где имя пользователя будет использоваться в качестве ключа)
2) SignOut - удалит данные из кеша

Вопрос 1. Правильно ли выполнить аутентификацию таким образом (в двух местах)?

Вопрос 2. Используется ли эта стратегия кеширования или я должен смотреть на использование службы aspnet и сеанса asp.net?

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

Любая идея

ответ

2

Вопрос 1:

Из моего опыта ASP формы аутентификации будет достаточно. Нет причин отправлять учетные данные как POST и, конечно, не GET. Вы можете использовать это для изменения пароля или метода учетной записи. Возможно, вы захотите изучить членство и роли.

Вопрос 2:

Я бы придерживаться сессии ASP.NET. Это может сделать ваше приложение более подверженным проблемам и уязвимостям в конце, и я считаю это ненужным.

+0

Но сессия истекает после рецикла приложения и продолжительность кэша будут как установлены Вами. – Pankaj

+0

Если вы не хотите потерять данные после повторного использования приложения, вы можете использовать SQL-сервер. http://support.microsoft.com/kb/317604 –

0

Если вы не хотите быть зависимым от ASP.NET, то вы не должны использовать любой сеанс

Что я мог бы совет:

  1. Используйте UserNameValidator, так что вам нужно отправьте имя пользователя/пароль по каждому запросу службе wcf (в Интернете есть много статей о том, как настроить UserNameValidator)

  2. Реализовать IAuthorizationPolicy, где вы можете получить данные пользователя для установки ролей и т. д.Этот объект создается один раз, затем повторно

Проблема заключается в том, что если вы используете только эти 2 компонента, вам нужно получить данные для каждого запроса, как вы не имеете никакого способа TRANSFERT имя пользователя из UserNameValidator на IAuthorizationPolicy Чтобы этого избежать, вам необходимо реализовать полный механизм проверки подлинности в WCF. Это не сложно, а вот это очень хорошая ссылка, которая поможет мне сделать это в 1 или 2 часа:

http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx

«PasswordAuthorizationPolicy» (в ссылке) создается один раз, а затем повторно , И для каждого запроса вызывается метод Evaluate.

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

1

Передача пароля между службами не является хорошая практика. Вы должны рассмотреть creating a custom security token в своем внешнем приложении и передать этот токен службе WCF. Служба WCF может проверять токен, используя сертификат. При таком подходе вы можете

  • вставлять любые пользовательские данные в маркер безопасности и использовать в службе WCF
  • кэша-маркер в прикладной сессии фронтальной, поэтому вам не нужен никакой распределенного кэш
  • централизовать Войти и избежать аутентификации пользователей дважды
+0

Спасибо, rosencreuz. Это действительно полезная информация. Но, мне интересно, что плохо, передавая пароль службе? – andrew

+0

Пароль - это конфиденциальная информация, вам необходимо ее закрепить. Лучшей практикой является сделать аутентификацию как можно раньше, так что вам не нужно заботиться об этом во всех приложениях. Например, скорее всего, вы не хотите шифровать свой внутренний трафик (SSL) между интерфейсом и службой WCF, вы не хотите проводить аудит безопасности для обработки паролей в службе WCF и т. Д. – rosencreuz

0

Мое предложение создать класс Authentication (или что-то еще) на WCF стороне:

public class Authentication<T> 
{ 
    public static Dictionary<string, T> Users { get; set; } 
} 

И если у вас есть класс User:

public class User 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    ... 
} 

Вы можете управлять пользователями, как это:

Authentication<User>.Users.Add("username", new User()); 
Смежные вопросы