Сеанс пользователя стека служб не работает

У меня есть API, написанный в ServiceStack, и я пытаюсь создать аутентификацию для клиентов. На данный момент к этому API будут обращаться только клиенты Android (Xamarin/C#). Сам API работает на сервере Debian с Apache/mod_mono

Прочитав информацию о Github, я до сих пор не уверен на 100%, как собрать это вместе таким образом, чтобы... после того, как клиент предоставил действительные учетные данные (для тестирования, базовая HTTP-аутентификация), пользователь получает сеанс, и учетные данные не проверяется снова при последующих запросах из того же сеанса.

Класс AppHost:

{
public class AppHost
    : AppHostBase
{       
    public AppHost() //Tell ServiceStack the name and where to find your web services
        : base("Service Call Service", typeof(ServiceCallsService).Assembly) { }

    public override void Configure(Funq.Container container)
    {
        //Set JSON web services to return idiomatic JSON camelCase properties
        ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

        // Session storage
        container.Register<ICacheClient>(new MemoryCacheClient());

        // auth feature and session feature
        Plugins.Add(new AuthFeature(
            () => new AuthUserSession(),
            new[] { new userAuth() }
        ) { HtmlRedirect = null } );
    }

    public class userAuth : BasicAuthProvider
    {
        public override bool TryAuthenticate(IServiceBase authService, string userName, string password)
        {
            peruseAuth peruseAuthHandler= new peruseAuth();
            errorLogging MyErrorHandler = new errorLogging() ; 
            if (peruseAuthHandler.ValidateUser(authService, userName, password))
            {
                try
                {
                    var session = (AuthUserSession)authService.GetSession(false);
                    session.UserAuthId = userName;
                    session.IsAuthenticated = true;
                    return true;
                }
                catch(Exception ex) 
                {
                   MyErrorHandler.LogError(ex, this) ;
                    return false ; 
                }
            }
            else
            {
                Console.Write("False");
                return false;
            }
        }
    }

JsonServiceClient: (только событие входа)

        btnLogin.Click += (sender, e) =>
            {
                // Set credentials from EditText elements in Main.axml
                client.SetCredentials(txtUser.Text, txtPass.Text);

                // Force the JsonServiceClient to always use the auth header
                client.AlwaysSendBasicAuthHeader = true;

            };

Я немного вел журнал, и кажется, что каждый раз, когда клиент выполняет действие, его имя пользователя/пароль проверяется по базе данных. Что-то здесь не так, или это ожидаемый результат?


person SeanH    schedule 26.09.2013    source источник


Ответы (1)


Для Basic Auth, когда учетные данные отправляются при каждом ожидаемом запросе.

Чтобы ServiceClient сохранил файлы cookie сеанса, прошедшие аутентификацию, вы должны установить флаг RememberMe при аутентификации, например, используя CredentialsAuthProvider:

var client = new JsonServiceClient(BaseUrl);
var authResponse = client.Send(new Authenticate {
    provider = "credentials", 
    UserName = "user",
    Password = "p@55word",
    RememberMe = true,
});

За кулисами это привязывает сеанс пользователя к файлу cookie ss-pid (постоянный файл cookie сеанса), который клиент сохраняет и повторно отправляет последующие запросы от этого экземпляра ServiceClient.

person mythz    schedule 26.09.2013