Как правильно использовать проверку подлинности ServiceStack в ASP.Net MVC-контроллере

У меня возникла проблема с получением атрибута ServiceStack [Аутентификация] для работы в контроллере ASP.Net MVC4, страницах/методах действий с атрибутом, чтобы перенаправить пользователей на страницу входа даже после правильной отправки данных для входа.

Я следовал примеру SocialBootstrapApi, с той разницей, что все вызовы веб-службы аутентификации сделаны из контроллеров:

this.CreateRestClient().Post<RegistrationResponse>("/register", model);

Другие вещи, которые я сделал до сих пор:

  • Используйте мой собственный подпрограмм для реализации пользовательского сеанса AuthUserSession (не слишком отличный от примера, но используя мою собственную реализацию таблицы User)
  • Наследовать ServiceStackController на моем BaseController, переопределяя URL-адрес входа по умолчанию
  • Включить функцию Auth в AppHost с моей реализацией пользовательского сеанса

Регистрация действительно работает, логика пользовательской авторизации работает (хотя сеанс не сохраняется), и я могу видеть куки ss-id и ss-pid в запросе.

Итак, мой полный список вопросов:

  • Как заставить атрибут [Аутентификация] работать (или, что я делал неправильно)?
  • Как сохранить и повторно использовать сеанс пользователя в контроллере MVC? На данный момент this.UserSession всегда имеет значение null.
  • Как мне выйти из системы? this.CreateRestClient().Get<AuthResponse>("/auth/logout");, похоже, не работает.

Обновление 1:
Файлы cookie сеанса (ss-id и ss-pid) создаются при попытке загрузить защищенную страницу (те, у которых есть атрибут [Authenticate]), до того, как будут переданы какие-либо учетные данные. Это ожидаемое поведение?

Обновление 2:
Я вижу, что сеанс сохранен в MemoryCacheClient, однако попытка получить его в базовом контроллере с помощью this.Cache.Get<CustomUserSession>(SessionKey) возвращает значение null (где SessionKey имеет вид: urn:iauthsession:1)

Ответы

Ответ 1

После долгих разворачиваний, по-видимому, путь для проверки подлинности ServiceStack - это вызов AuthService через:

try {
    authResponse = AuthService.Authenticate(new Auth{ UserName = model.UserName, Continue = returnUrl, Password = model.Password });
} catch (Exception ex) {
    // Cut for brevity...
}

и НЕ authResponse = this.CreateRestClient().Post<AuthResponse>("/auth/credentials", model);!

Где AuthService определяется в базовом контроллере как:

public AuthService AuthService
{
    get
    {
        var authService = ServiceStack.WebHost.Endpoints.AppHostBase.Instance.Container.Resolve<AuthService>();
        authService.RequestContext = new HttpRequestContext(
            System.Web.HttpContext.Current.Request.ToRequest(),
            System.Web.HttpContext.Current.Response.ToResponse(),
            null);

        return authService;
    }
}

Все остальное (включая сеанс) работает правильно.

Ответ 2

Вы можете найти, как это можно сделать в хранилище ServiceStack Use Cases. Следующий пример основан на MVC4, но отлично работает для MVC3: CustomAuthenticationMvc.