我有一个验证用户的UIWebView。我想启用单点登录。为此,我想在用户首次通过身份验证时存储Cookie,然后在下次启动应用程序时,Cookie会自动传递到UIWebView并在没有再次输入凭据的情况下对用户进行身份验证。
我正在做类似下面的事情来使用UIWebView
var uri = new Uri(AuthUrl);
var nsurl = new NSUrl(uri.GetComponents(UriComponents.HttpRequestUrl, UriFormat.UriEscaped));
wvLogin.LoadRequest(new NSUrlRequest(nsurl));
CookieManager.cs
public static void SaveCookies()
{
var cookieData = new NSMutableArray ();
var cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies) {
var cookieDictionary = new NSMutableDictionary ();
cookieDictionary.Add (NSHttpCookie.KeyName, new NSString (nscookie.Name));
cookieDictionary.Add (NSHttpCookie.KeyValue,new NSString ( nscookie.Value));
cookieDictionary.Add (NSHttpCookie.KeyDomain,new NSString ( nscookie.Domain));
cookieDictionary.Add (NSHttpCookie.KeyPath, new NSString (nscookie.Path));
cookieDictionary.Add (NSHttpCookie.KeySecure, new NSString ( nscookie.IsSecure.ToString()));
cookieDictionary.Add (NSHttpCookie.KeyVersion, new NSString (nscookie.Version.ToString()));
if (nscookie.ExpiresDate != null) {
cookieDictionary.Add (NSHttpCookie.KeyExpires, nscookie.ExpiresDate);
}
cookieData.Add (cookieDictionary);
}
cookieData.WriteToFile (StoragePath(), true);
}
public static string StoragePath()
{
//var paths = NSSearchPath.GetDirectories (NSSearchPathDirectory.LibraryDirectory, NSUserDomainMask, true);
var paths = NSSearchPath.GetDirectories(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User, true);
return paths [0].ToString ();
}
public static void DeleteCookies()
{
NSHttpCookieStorage cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
{
cookieStorage.DeleteCookie(nscookie);
}
NSUserDefaults.StandardUserDefaults.Synchronize ();
}
public static void LoadCookies()
{
var cookies = NSMutableArray.FromFile (StoragePath());
var cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
{
cookieStorage.SetCookie(nscookie);
}
}
LoginScreen.cs
void wvLogin_LoadFinished(object sender, EventArgs e)
{
int redirectCount = 0;
redirect = System.Net.WebUtility.UrlDecode(wvLogin.Request.Url.AbsoluteString);
// Do some stuff
CookieManager.SaveCookies();
}
}
else
{
AppDelegate.Logout();
}
}
}
我怎样才能做到这一点? 任何帮助都是值得赞赏的,因为我是iOS和Xamarin的新手。
答案 0 :(得分:4)
您可以通过设置合适的到期日期来设置服务器以发出持久性cookie。 UIWebview将存储/恢复此类cookie。
您还可以通过NSHTTPCookieStorage中的UIWebView中的登录设置所有Cookie,以保存在钥匙串中的NSUserDefaults中。您可以在应用程序启动时从NSUserDefaults / keychain读取cookie,将其插入NSHttpCookieStorage,它们将可供UIWebView以及NSURLConnection,NSURLRequest等使用。
答案 1 :(得分:2)
我建议使用sfSafariViewController。
SafariViewControllers可以访问Safari的cookie存储空间。 SafariViewControllers的优势在于,您可以为您处理大部分内容,并且实现非常简单。
为了安全起见,SafariViewController的沙盒来自应用程序的其余部分以保护cookie等。
但是,如果在您的网络服务中,您实施了API以重定向到附加了Cookie数据的自定义网址,例如com.app://name/bob/age/12
并在您的应用中将com.app
设置为custom URL scheme,然后您可以使用Cookie数据重定向回您的应用。
SafariViewControllers的优势在于,如果用户在Safari中导航到您的网站,用户仍会登录您的服务。
Here是如何实现所有这些的示例。您可以克隆此repo并运行它以自行尝试。
希望这对你有所帮助,
利安