2013-09-26 9 views
1

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

После прочтения в 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; 

      }; 

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

ответ

1

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

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

var client = new JsonServiceClient(BaseUrl); 
var authResponse = client.Send(new Authenticate { 
    provider = "credentials", 
    UserName = "user", 
    Password = "[email protected]", 
    RememberMe = true, 
}); 

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

Смежные вопросы