Szukałem stackoverflow, google, apple i innych miejsc. Podane wskazówki wyglądają obiecująco, ja je zaimplementowałem, ale wydaje mi się, że nie działają one ani nie są wymuszane.Nie można ponownie uwierzytelniać przy użyciu różnych NSURLCredentials (używane są stare usunięte)
Problem: Mam numer NSURLConnection
z określonymi poświadczeniami. Następnie mam wylogowanie, w którym usuwam dane uwierzytelniające, obszar ochrony, usuwam wszystkie buforowane odpowiedzi i usuwam wszystkie pliki cookie w sharedHTTPCookieStorage
, ale po ponownym wywołaniu mojego uwierzytelnionego żądania kilka sekund później, nawet przy błędnych danych wciąż używam starego (usunięto) poświadczenia
Oto niektóre ekstrakty kod, gdzie poświadczenia są usuwane
NSDictionary *credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
if ([credentialsDict count] > 0) {
// the credentialsDict has NSURLProtectionSpace objs as keys and dicts of userName => NSURLCredential
NSEnumerator *protectionSpaceEnumerator = [credentialsDict keyEnumerator];
id urlProtectionSpace;
// iterate over all NSURLProtectionSpaces
while (urlProtectionSpace = [protectionSpaceEnumerator nextObject]) {
NSEnumerator *userNameEnumerator = [[credentialsDict objectForKey:urlProtectionSpace] keyEnumerator];
id userName;
// iterate over all usernames for this protectionspace, which are the keys for the actual NSURLCredentials
while (userName = [userNameEnumerator nextObject]) {
NSURLCredential *cred = [[credentialsDict objectForKey:urlProtectionSpace] objectForKey:userName];
WriteLog(@"Method: switchView removing credential %@",[cred user]);
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:cred forProtectionSpace:urlProtectionSpace];
}
}
}
I następnie usunąć wszystkie buforowane Odpowiedzi
NSURLCache *sharedCache = [NSURLCache sharedURLCache];
[sharedCache removeAllCachedResponses];
I następnie usunąć wszystkie ciasteczka
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookies];
for (NSHTTPCookie *cookie in cookies) {
[cookieStorage deleteCookie:cookie];
NSLog(@"deleted cookie");
}
Próbowałem też stosując żadnych ciasteczka i inne polityki
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
[request setHTTPShouldHandleCookies:NO];
if(self.currentCookies != nil){
[request setAllHTTPHeaderFields:
[NSHTTPCookie requestHeaderFieldsWithCookies:nil]];
}
theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
Próbowałem również tę wskazówkę tu specjalnie przechowywania cookies i przekazując je ponownie. http://www.hanspinckaers.com/multiple-nsurlrequests-with-different-cookies. W sieci jest inny blog sugerujący dodanie "#" do każdego adresu URL w celu wymuszenia ponownego uwierzytelnienia, które działa, ale po prostu nie rozwiązuje problemu, ponieważ muszę liczyć się na poświadczenia sesji i możliwość korzystania z zupełnie innych poświadczeń.
Czy jest to błąd lub znany problem i jak naprawdę rozwiązać ten problem ... Mówiąc wprost: Co dokładnie robię źle tutaj?
To naprawdę mnie dręczy i powstrzymuje mnie od kontynuowania pracy.
Byłbym bardzo wdzięczny za wszelkie dane wejściowe!
Wielkie dzięki!
Mam ten sam problem. - Nie mogę uzyskać poświadczeń z pamięci raz włożyłam je w Wywołanie -removeCredential ... wydaje się mieć żadnego efektu. – paulmelnikow
I, o ile jest to warte, moją "poprawką" było zaadaptowanie mojej aplikacji do korzystania z asynchronicznego API, co pozwala mi dostarczać referencje dokładnie w taki sposób, jaki wybieram. – paulmelnikow
Jeśli myślisz, że usunięcie plików cookie i wyczyszczenie pamięci podręcznej "może" nie działa, to innym sposobem byłoby scalenie poświadczeń, identyfikatora użytkownika lub hasła z losowym tekstem, aby logowanie zakończyło się niepowodzeniem do momentu wprowadzenia poprawnego poświadczenia! – Annjawn