Я использую ServiceStack v4 с пользовательской аутентификацией. Это настройка и правильная работа. Я могу вызвать службу/auth и получить возвращенный запрос AuthorizationResponse с уникальным SessionId.сеанс пользователя ServiceStack не найден при использовании sessionId в клиенте Заголовки или файлы cookie
У меня также есть плагин smagger-ui setup. Используя его, я могу выполнить аутентификацию через/auth, а затем вызвать одну из моих других служб, для которой требуется аутентификация без проблем.
Теперь, из вторичного приложения MVC, использующего C# JsonServiceClient, я снова могу успешно выполнить вызов/auth, а затем защищенные службы, используя один и тот же объект-клиент. Однако, если я распоряжаюсь этим клиентом (после сохранения уникального sessionId в файл cookie), затем создайте новый клиент и добавьте sessionId в виде файла cookie или через заголовки, используя x-ss-pid, как описано, вызовы возвращаются 401. Если я вызываю небезопасную службу, но затем попытаюсь получить доступ к уникальному сеансу пользователя, он вернет новый сеанс.
Если я смотрю заголовки запроса в этой службе, cookie или заголовок четко задаются с помощью sessionId. SessionId также существует в sessionCache. Проблема заключается в том, что код, который пытается получить сеанс от запроса, не находит его.
Чтобы быть более конкретным, представляется, что ServiceExtensions.GetSessionId рассматривает HostContext, а не вызывающий запрос. Я не знаю, почему. Возможно, я неправильно понимаю что-то на этом пути.
Если я непосредственно попытаюсь выполнить ожидаемую сессию с помощью следующего кода, она будет найдена без проблем.
var req = base.Request;
var sessionId = req.GetHeader("X-" + SessionFeature.PermanentSessionId);
var sessionKey = SessionFeature.GetSessionKey(sessionId);
var session = (sessionKey != null ? Cache.Get<IAuthSession>(sessionKey) : null)?? SessionFeature.CreateNewSession(req, sessionId);
Итак, я пропустил что-то очевидное здесь? Или, может быть, не так очевидно при создании моего вторичного клиента?
Пример кода клиента вызывает
Вот мой код авторизации. Он содержится в классе контроллера. Это только соответствующие части.
using (var client = new JsonServiceClient(WebHelper.BuildApiUrl(Request)))
{
try
{
loginResult = client.Post(new Authenticate()
{
UserName = model.Email,
Password = model.Password,
RememberMe = model.RememberMe
});
Response.SetCookie(new HttpCookie(SessionFeature.PermanentSessionId, loginResult.SessionId));
return true;
}
}
Вот мой вторичные установки клиента и служба вызова, содержащийся в его собственном классе контроллера в другой области приложения MVC
using (var client = new JsonServiceClient(WebHelper.BuildApiUrl(Request)))
{
var cCookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);
if (cCookie != null)
{
client.Headers.Add("X-" + SessionFeature.PermanentSessionId, cCookie.Value);
client.Headers.Add("X-" + SessionFeature.SessionOptionsKey, "perm");
}
response = client.Get(new SubscriptionStatusRequest());
}
Дополнительного обновление
В Authenticate процесс вызывается из HttpRequestExtensions с именем = SessionFeature.PermanentSessionId
public static class HttpRequestExtensions
{
/// <summary>
/// Gets string value from Items[name] then Cookies[name] if exists.
/// Useful when *first* setting the users response cookie in the request filter.
/// To access the value for this initial request you need to set it in Items[].
/// </summary>
/// <returns>string value or null if it doesn't exist</returns>
public static string GetItemOrCookie(this IRequest httpReq, string name)
{
object value;
if (httpReq.Items.TryGetValue(name, out value)) return value.ToString();
Cookie cookie;
if (httpReq.Cookies.TryGetValue(name, out cookie)) return cookie.Value;
return null;
}
Теперь, что происходит, это httpReq.Items содержит значение SessionFeature.PermanentSessionId, но я не знаю, почему и где это устанавливается. Я даже не понимаю в этот момент, что контейнер Items находится на IRequest. Таким образом, код никогда не попадает в функции проверки моих файлов cookie или заголовков
Интересно. Сейчас я попробую попробовать (включая дополнительный opt = perm). Для меня документация не обязательно ясна. Лучший ответ, который я нашел на сегодняшний день, также не включал эту потребность. [Ссылка] (http://stackoverflow.com/questions/19160839/reconnecting-to-servicestack-session-in-an-asp-net-mvc4-application). Я скоро вернусь к своим результатам. – tracstarr
Это не имело значения. Я попытался использовать оба заголовка и куки, добавляя дополнительный ss-opt. Я уточню свой вопрос с дополнительным примером кода вызовов. – tracstarr
@tracstarr FYI исправил проблему с переопределением SessionIds, пример выше теперь работает с v4.0.37 +, это [доступно на MyGet] (https://github.com/ServiceStack/ServiceStack/wiki/MyGet). – mythz