Phonegap上的ASP.NET窗体身份验证问题(Android)
|
我有一个ASP.NET MVC / Web API后端,我已经为我的Phonegap应用程序实现表单验证。登录通过发送用户凭据通过jQuery Ajax调用执行,如下所示: $.ajax({
type: "POST",url: "/api/authentication/login",data: JSON.stringify({ Username: username,Password: password }),contentType: "application/json; charset=utf-8",dataType: "TEXT",statusCode: {
200: function (response,status,xhr) {
// successfully authenticated
Backbone.history.navigate("/",{ trigger: true });
}
}
});
后端登录方法如下所示: [ActionName("login")]
[AllowAnonymous]
public LoginResult Login(LoginCredentials credentials)
{
// doing all kinds of things here
// if valid credentials
FormsAuthentication.SetAuthCookie(loginID,true);
return loginResult;
}
我有这个在我的Web.config: <authentication mode="Forms">
<forms
name=".ASPXAUTH"
loginUrl="/login"
defaultUrl="/home"
protection="All"
slidingExpiration="true"
timeout="525600"
cookieless="UseCookies"
enableCrossAppRedirects="false"
requireSSL="true"
>
</forms>
</authentication>
现在Android的问题是,这里的cookie是正确设置,它在登录后,我的授权方法工作,但有时(经常)当我关闭应用程序,并再次打开,我不再登录。是不是有了,我不能在请求中看到它。这不应该发生,因为我已经设置超时为525600.我注意到,这个问题经常发生时,我在登录后立即关闭应用程序。在另一方面,如果我注销,然后登录,而不关闭应用程序,cookie正确保存。 但是,如果我得到cookie,坚持,大多数时间的注销行为也奇怪。这是我如何做注销请求: $.ajax({
type: "POST",url: "/api/authentication/logout",data: "{}",dataType: "text"
success: function (response) {
// successfully logged out
Backbone.history.navigate("api/login",{ trigger: true });
}
});
后端: [ActionName("logout")]
[AllowAnonymous]
public String Logout()
{
FormsAuthentication.SignOut();
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,"");
cookie.Expires = DateTime.Now.AddYears(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
return "home";
}
现在类似于登录的问题,注销首先似乎成功,cookie不再与任何请求一起发送。但是,当我关闭应用程序并再次打开它,cookie回来,我再次登录。我可以看到,该cookie的值与我认为我刚刚删除的值相同,将其过期时间设置为过去。 我已经尝试过各种各样的技巧,如: >在登录/注销后额外重新加载(location.reload()) 身份验证在iOS和Windows Phone上正常工作。该问题仅发生在Android上(在KitKat和Lollipop上测试)。在Android模拟器上没有问题,但在真实设备和Visual Studios Android模拟器这种情况发生所有的时间。 我不知道从哪里走。在Android WebView中有什么可能会导致这种行为吗?还有别的东西我可以试试吗?请帮忙! 我很乐意在需要时提供更多信息。 编辑: FormsAuthentication.SignOut(); HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName]; cookie.Expires = DateTime.Now.AddYears(-1); HttpContext.Current.Response.Cookies.Clear(); HttpContext.Current.Response.Cookies.Add(cookie); return "home"; 而不是创建一个新的cookie,我使用响应中的一个。它不起作用。 我也试过从这里发现的东西:http://techblog.dorogin.com/2013/01/formsauthentication-gotcha-with-signout.html也没有什么区别,路径不是问题。仍在寻找一个解决方案。 另一个编辑: >登录:我在登录后进行两次重新加载,然后请求 我不喜欢这些黑客,我仍然希望一个更好的解决方案。 解决方法PhoneGap从file://协议加载文件。不幸的是,不允许跨源请求,除非您打开所有主机的跨源请求*,这个问题将无法解决。有多种方法可以固定,但它们真的很长。 从http://加载Html 从Web服务器而不是本地存储加载整个网站。这将删除跨源请求的所有问题。好处是,您不需要在更改UI时发布新版本的应用。但你必须实现非常强大的缓存,第一次打开应用程序将需要更长的时间。 拦截http://并传递本地文件 你知道,phonegap只是使用WebView,在所有平台上,你可以简单地重写Url协议从应用程序的本地存储注入文件。这将更快,浏览器将认为它正在从相同的资源加载html。 设置OAuth自定义标头进行身份验证 >重定向到您网站上托管的登录页面说http://domain.com/api/login>成功登录后,使用PhoneGap localStorage(不是浏览器的localStorage)存储授权。>从应用程序导航到您的本地html页面,并为您发送到服务器的每个json api请求,在ajax请求中发送授权头作为单独的头。>设置授权模块,您可以手动授权asp.net请求,如果您的授权是通过http请求中的自定义标头发送 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC4代码优先 – ‘无法附加文件作为数据库’异常
- Asp.NET控制文件上传的大小方法(超简单)
- 在ASP.NET 4 ReportViewer中使用对象数据源
- ASP.NET标签控件 – 不编码HTML
- asp.net – MVC 3部署到IIS6
- asp.net-mvc-3 – MVC 3 knockoutjs:在使用EditorFor作为布
- asp.net-mvc – 从递归模型创建表单
- asp.net-mvc-3 – 新加载页面而不是缓存
- asp.net – 可以创建.config文件并将其包含到web.config中吗
- asp.net – 使用ModalPopupExtender而不必设置TargetContro
- asp.net-mvc-4 – 首先无法识别mvc代码中的“启用
- ASP.NET Web Forms 4.5模型绑定,其中模型包含一个
- asp.net – 当完全执行OnResultExecuted和OnResu
- 使用asp.net中的web api通过http进行身份验证
- asp.net – .NET – 如何调试DLL?
- 为什么IIS不会执行我的自定义404页面?它试图改为
- asp.net-mvc – LINQ到EF有什么问题?
- iis-7 – ASP 3.0应用程序对象
- asp.net-mvc – MVC @ Url.Content vs @ Url.Act
- 需要ASP.Net/MVC Rich Text Editor
