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 сеансов).