WCF - Почему "CustomAuthorizationPolicy" создает "CustomPrincipal" для каждой операции?
Я разрабатываю службу WCF с пользовательским валидатором USERNAME-PASSWORD.
У меня есть CustomUserNameValidator, который наследуется от UserNamePasswordValidator.
Я также использую CustomAuthorizationPolicy, который наследуется от IAuthorizationPolicy.
Метод Evaluate пользовательской политики авторизации выглядит следующим образом:
// this method gets called after the authentication stage
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
// get the authenticated client identity
IIdentity client = GetClientIdentity(evaluationContext);
// set the custom principal
evaluationContext.Properties["Principal"] = new CustomPrincipal(client);
return true;
}
Как видите, я создаю новый объект CustomPrincipal при каждом вызове Evaluate (что делается в каждой операции, вызываемой в службе).
Вот как выглядит мой конструктор CustomPrincipal:
public CustomPrincipal(IIdentity identity)
{
IdentityObject = identity;
GetUser(IdentityObject.Name);
EnsureRoles();
}
Методы GetUser и EnsureRoles идут в базу данных SQL, чтобы проверить роли для пользователя.
Мой вопрос - почему это должно происходить на каждой операции??
Почему создание CustomPrincipal происходит при каждой операции, а не только при первом подключении клиента к службе?
Мне не имеет смысла, почему для каждой операции, вызываемой в службе - "CustomPrincipal" будет идти в базу данных и повторно извлекать пользователя и все его роли...
[Обновить] Вот как выглядит мой интерфейс службы запросов:
[ServiceContract(Namespace = "http://www.my1fj.com/QueryService/2012/", SessionMode = SessionMode.Required, ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IQueryService
{
// Some operations
}
1 ответ
Я надеюсь, что ваша услуга - это услуга для каждого звонка, а в услугах для каждого звонка проверка подлинности будет выполняться при каждом вызове, но в случае услуг для каждого сеанса проверка происходит только в начале сеанса (если включено согласование безопасности).
..от сюда
Вместо того, чтобы нажимать на БД каждый раз, когда вы можете кэшировать их в сервисе.
Обновить:
Услуга "на вызов" / "на сеанс" / "синглтон" определяется InstanceContextMode
собственность ServiceBehavior
это применяется к классу обслуживания.
Ex.
[ServiceContract]
interface IMyContract {...}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract {...}
Чтобы узнать больше о, пожалуйста, проверьте этот пост. Чтобы узнать больше о InstanceContextMode
Собственность проверить это.