asp.net, аутентификация и кэширование wcf - PullRequest
2 голосов
/ 14 марта 2012

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

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

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

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

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

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

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

Любая идея

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

Вопрос 1:

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

Вопрос 2:

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

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

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

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

Я предлагаю создать класс Аутентификация (или что-то еще) на стороне WCF:

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

А если у вас есть класс пользователя:

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

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

Authentication<User>.Users.Add("username", new User());
0 голосов
/ 20 марта 2012

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...