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 Собственность проверить это.

Другие вопросы по тегам