ServiceStack Аутентифицирует оба приложения iOS, когда один из них вошел в систему

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

Проблема заключается в том, что если я вхожу в одно из приложений, второе приложение проходит проверку подлинности и не требует от меня входа в систему в результате использования метода 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;
    }
}

1 ответ

Решение

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

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

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

Другие вопросы по тегам