0

Я использую потрясающий ServiceStack для реализации моего бэкэнда REST, который обслуживает два приложения для iPhone, написанные на Xamarin. Все работает отлично, но я изо всех сил стараюсь правильно работать, когда два приложения установлены на одном устройстве!ServiceStack Аутентифицирует оба приложения для iOS, когда один из них зарегистрирован в

Проблема в том, что если я вхожу в систему в одном из приложений, второе приложение получает аутентификацию и не требует, чтобы я входил в систему в качестве метода isCurrentUserAuthenticated().

Я передаю куки-файлы с моими запросами, чтобы имитировать браузер, и чтобы каждый пользователь не должен был передавать свои учетные данные каждый раз, но я думаю, проблема в том, что, возможно, ServiceStack видит два запроса аутентификации от одного и того же IP-адреса, чтобы он аутентифицировал их оба с использованием первых запросов на аутентификацию успешно завершены.

Примечание. Эти два приложения обращаются к одной базе данных и таблице UserAuth, но каждое приложение поддерживает роль пользователя, отличную от другой.

Единственный способ исправить это - выйти из второго приложения, чтобы пользователь мог снова войти в систему со своими учетными данными, чтобы все работало.

Помогите с этим?

Вот код до сих пор:

public static class BLL 
{ 
    public static JsonServiceClient ServiceClient { get; set; } 

    public static string HostUri = "http://test.elasticbeanstalk.com"; 
    public static string HostDomain = "test.elasticbeanstalk.com"; 

    static BLL() 
    { 
     string ss_id = ConfigRepository.GetConfigString ("ss-id"); 
     string ss_pid = ConfigRepository.GetConfigString ("ss-pid"); 

     ServiceClient = new JsonServiceClient (HostUri); 

     ServiceClient.CookieContainer.Add (new Cookie ("ss-id", ss_id, "/", HostDomain)); 
     ServiceClient.CookieContainer.Add (new Cookie ("ss-pid", ss_pid, "/", HostDomain)); 
    } 


    public static async Task<bool> isCurrentUserAuthenticated() 
    { 
     bool result = false; 

     try { 

      Authenticate authRequest = new Authenticate(); 

      // Restore the cookie 
      var response = await ServiceClient.PostAsync<AuthenticateResponse> (authRequest); 

      NSUserDefaults.StandardUserDefaults.SetString (response.UserId, "UserId"); 
      NSUserDefaults.StandardUserDefaults.Synchronize(); 

      result = true; 

     } catch (Exception Ex) { 
      result = false; 
     } 

     return result; 
    } 

    public static async Task<AuthenticateResponse> Login (string userName, string password) 
    { 
     Authenticate authRequest = new Authenticate() { 
      provider = "credentials", 
      UserName = userName, 
      Password = password, 
      RememberMe = true, 
     }; 

     var response = await ServiceClient.PostAsync<AuthenticateResponse> (authRequest); 

     var cookies = ServiceClient.CookieContainer.GetCookies (new Uri (HostUri)); 

     if (cookies != null) { 
      var ss_id = cookies ["ss-id"].Value; 
      var ss_pid = cookies ["ss-pid"].Value; 

      if (!ss_id.IsNullOrEmpty()) { 
       int r = ConfigRepository.AddConfigKey ("ss-id", ss_id); 
       System.Diagnostics.Debug.WriteLine ("ss-id " + ss_id.ToString()); 
      } 
      if (!ss_pid.IsNullOrEmpty()) { 
       int r = ConfigRepository.AddConfigKey ("ss-pid", ss_pid); 
       System.Diagnostics.Debug.WriteLine ("ss-pid " + ss_pid.ToString()); 
      } 
     } 

     NSUserDefaults.StandardUserDefaults.SetString (response.UserId, "UserId"); 
     NSUserDefaults.StandardUserDefaults.Synchronize(); 


     return response; 
    } 

    public static async Task<AuthenticateResponse> Logout() 
    { 
     Authenticate authRequest = new Authenticate() { 
      provider = "logout" 
     }; 

     var response = await ServiceClient.PostAsync<AuthenticateResponse> (authRequest); 
     return response; 
    } 
} 
+0

Как служба знает, какое приложение запрашивает auth? Вы не передаете какой-либо идентификатор приложения в запросе. – Jason

+0

@Jason Я знаю, но даже если я передам идентификатор приложения, как ServiceStack будет обрабатывать это из коробки? я не могу контролировать запрос аутентификации. Так что мне нужно переопределить поставщика проверки подлинности? –

+0

@Jason Я думаю, что вы на правильном пути, но если я добавлю идентификатор приложения с значениями cookie, чтобы они были уникальными на уровне приложения, как стек службы будет соответствовать куки, которые я отправляю, с кешем? это никогда не будет соответствовать. означает ли это, что мне нужно переопределить TryAuthenticate(), чтобы справиться с этой логикой? thx –

ответ

1

Проблема в том, что вы используете те же куки сессии с общим ServiceClient экземпляра, который заканчивает тем, что ссылки на одни и те же идентифицированные пользователи Session.

ServiceStack Sessions основаны только на идентификаторах сеанса (ss-id/ss-pid), указанных куки-клиентами, если вы используете одни и те же файлы cookie, вы будете ссылаться на один и тот же сеанс аутентифицированных пользователей, на них не влияет IP-адрес Адрес или что-то еще.

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

+0

Спасибо Mythz за ваш ответ .. это имеет смысл, но на самом деле, как общий экземпляр, если все исполняются в отдельном приложении? приведенный выше код действительно находится в отдельном совместном проекте, но когда выполнение происходит, каждое приложение имеет свой собственный экземпляр клиента ServiceStack. Так что мне делать точно? Просьба уточнить .. thankt много –

+0

@MohammadZekrallah экземпляр не используется, но по внешнему виду вашего кода вы, вероятно, используете одни и те же файлы cookie - это то, что определяет, какую сессию используют клиенты. – mythz

+0

Я вижу .. так что я должен добавить, возможно, идентификатор приложения с значениями cookie? поэтому они уникальны на уровне приложений? но опять же, если я это сделаю, как стек службы будет соответствовать куки, которые я отправляю, с тем, который он кэшировал? он никогда не будет соответствовать. Я не знаю, если я буду лишним немым здесь, но я не вижу, как это будет работать. –

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

  • Нет связанных вопросов^_^