Я использую AuthenticationService, полученную из AuthenticationBase, в стандартном шаблоне бизнес-приложения для RIA Services и использую проверку подлинности с помощью форм. У меня есть собственный CustomPrincipal, созданный моей инфраструктурой безопасности, который я назначаю Thread.CurrentPrincipal, чтобы он мог использоваться другими вызовами службы:
protected override bool ValidateUser(string userName, string password)
{
try
{
using (LoginService service = new LoginService())
{
SessionInfo info = service.Login(userName, password);
Thread.CurrentPrincipal = info.User;
SessionCache.Instance.Save(info);
}
}
catch (Exception e)
{
return false;
}
}
Однако я обнаружил, что при вызове других (неаутентификационных) RIA-сервисов Thread.CurrentPrincipal сбрасывается в объект GenericPrincipal, поэтому при инициализации других сервисов я переопределяю метод Initialize () доменный сервис и установите Thread.CurrentPrincipal, просмотрев логин в кэше сеанса:
public override void Initialize(DomainServiceContext context)
{
base.Initialize(context);
if (context.User.Identity.IsAuthenticated)
{
SessionInfo info = SessionCache.Instance.FindByUsername(context.User.Identity.Name);
Thread.CurrentPrincipal = info.User;
}
}
Сейчас этот поиск выполняется по имени пользователя, потому что он легко доступен в GenericPrincipal, но я бы предпочел, чтобы я мог выполнить поиск через токен сеанса. Существует ли способ с помощью служб RIA для простого сохранения маркера сеанса на сервере в течение всего сеанса? Я знаю, что мог бы сохранить этот токен сеанса в файле cookie в браузере, чтобы сохранить его, но, похоже, должен существовать более простой способ сохранения токена сеанса в течение всего срока его существования. Возможно, метод cookie - лучший способ сделать это, но я просто хотел подтвердить.