Я использую потрясающий 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;
}
}
Как служба знает, какое приложение запрашивает auth? Вы не передаете какой-либо идентификатор приложения в запросе. – Jason
@Jason Я знаю, но даже если я передам идентификатор приложения, как ServiceStack будет обрабатывать это из коробки? я не могу контролировать запрос аутентификации. Так что мне нужно переопределить поставщика проверки подлинности? –
@Jason Я думаю, что вы на правильном пути, но если я добавлю идентификатор приложения с значениями cookie, чтобы они были уникальными на уровне приложения, как стек службы будет соответствовать куки, которые я отправляю, с кешем? это никогда не будет соответствовать. означает ли это, что мне нужно переопределить TryAuthenticate(), чтобы справиться с этой логикой? thx –