Как правильно использовать проверку подлинности 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.