У меня точно такая же проблема.
Я использую API для соединения с моей базой данных Oracle, и я "проверяю" данные для входа, открывая соединение.
Затем я хочучтобы хранить это соединение где-то (достаточно просто, я создам пул соединений для всех разных пользователей), но также создаю пользовательскую личность и принципала, представляющих этого пользователя, так что, как только он попадет в мою пользовательскую IAuthorizationPolicy, ему не нужноперезагрузите эту информацию.
Я много занимался поиском и ничего не нашел, поэтому я планирую сделать это:
Проверить данные для входа в систему в пользовательском UserNamePasswordValidator, открыв APIconnection.
Хранить открытое соединение в пуле соединений под именем пользователя.
Когда вызывается мой пользовательский IAuthorizationPolicy.Evaluate (), я будупосмотрите на предоставленную общую идентификацию:
IIdentity GetClientIdentity(EvaluationContext evaluationContext)
{
object obj;
if (!evaluationContext.Properties.TryGetValue("Identities", out obj))
throw new Exception("No Identity found");
IList<IIdentity> identities = obj as IList<IIdentity>;
if (identities == null || identities.Count <= 0)
throw new Exception("No Identity found");
return identities[0];
}
(извините, я не могу избавиться от этого плохого выхода из HTML)
Затем я получаю соединение из пула на основе IIdentity.Name, использую это соединение для загрузки пользовательских данных из базы данных и сохраняю их в пользовательских идентификаторах и принципалах, которые я установил в EvaluationContext:
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
IIdentity identity = GetClientIdentity(evaluationContext);
if (identity == null)
throw new Exception();
// These are my custom Identity and Principal classes
Identity customIdentity = new Identity();
Principal customPrincipal = new Principal(customIdentity);
// populate identity and principal as required
evaluationContext.Properties["Principal"] = customPrincipal;
return true;
}
Тогда я должен иметь доступ к своей пользовательской идентификационной информации и принципалу всякий раз, когда мне это нужно, с помощью System.Threading.Thread.CurrentPrincipal или CurrentIdentity.
Надеюсьпомогает каким-то образом;Я не уверен, что это лучший способ сделать это, но это лучшее, что я придумал до сих пор ...
Стив