bal*_*fin 25 asp.net authentication cookies android cordova
我有一个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 });
}
}
});
Run Code Online (Sandbox Code Playgroud)
后端登录方法如下所示:
[ActionName("login")]
[AllowAnonymous]
public LoginResult Login(LoginCredentials credentials)
{
// doing all kinds of things here
// if valid credentials
FormsAuthentication.SetAuthCookie(loginID, true);
return loginResult;
}
Run Code Online (Sandbox Code Playgroud)
我在我的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>
Run Code Online (Sandbox Code Playgroud)
现在Android的问题在于cookie已正确设置并且在登录后它确实适用于我的授权方法,但有时(经常)当我关闭应用程序并再次打开它时,我不再登录.该cookie不在了,我在请求中看不到它.这不应该发生,因为我已将超时设置为525600.我注意到在登录后立即关闭应用程序时经常会出现此问题.另一方面,如果我注销然后在不关闭应用程序的情况下登录,则cookie会正确保存.
但是,如果我坚持使用cookie,大部分时间注销都会表现得很奇怪.这是我执行注销请求的方式:
$.ajax({
type: "POST",
url: "/api/authentication/logout",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "text"
success: function (response) {
// successfully logged out
Backbone.history.navigate("api/login", { trigger: true });
}
});
Run Code Online (Sandbox Code Playgroud)
后端:
[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";
}
Run Code Online (Sandbox Code Playgroud)
现在类似于登录的问题,注销首先似乎是成功的,并且cookie不再与任何请求一起发送.但当我关闭应用程序并再次打开它时,cookie又回来了,我又重新登录了.我可以看到cookie的值与我刚刚删除的那个值相同,它将过期时间设置为过去.
我尝试过各种各样的技巧,比如:
location.reload()
)身份验证在iOS和Windows Phone上按预期工作.问题仅发生在Android上(在KitKat和Lollipop上测试).在Android模拟器上没问题,但在真实设备和Visual Studios Android模拟器上这种情况一直都会发生.
我不知道从这里往哪个方向走.Android WebView中是否存在可能导致此类行为的内容?还有其他我可以测试的东西吗?请帮忙!
如果需要,我非常乐意提供更多信息.
编辑: 受Fabian的评论启发,我将注销方法更改为:
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";
Run Code Online (Sandbox Code Playgroud)
我没有创建新的cookie,而是在响应中使用了一个.那没起效.
我也尝试过从这里找到的东西:http://techblog.dorogin.com/2013/01/formsauthentication-gotcha-with-signout.html这也没有区别,路径不是问题.仍在寻找解决方案.
另一个编辑: 仍然无法找到解决方案.我不得不做出可怕的解决方法.
我对这些黑客不满意,我仍然希望有更好的解决方案.
PhoneGap 从协议加载文件file://
。不幸的是,不允许跨源请求,除非您从所有主机打开跨源请求*
,否则此问题将无法解决。
有多种方法可以解决这个问题,但它们真的很长。
从以下位置加载 Htmlhttp://
从网络服务器而不是本地存储加载整个网站。这消除了跨源请求的所有问题。好处是更改 UI 时无需发布新版本的应用程序。但是您必须实施非常强大的缓存,并且首次打开应用程序将需要更长的时间。
本地文件的拦截http://
和下发
如您所知,phonegap 仅使用 WebView,在所有平台中,您只需重写 Url 协议即可从应用程序的本地存储注入文件。这会更快,并且浏览器会认为它正在从同一资源加载 html。
设置 OAuth + 自定义标头进行身份验证
http://domain.com/api/login
PhoneGap localStorage
(不是浏览器的localStorage)存储授权。 归档时间: |
|
查看次数: |
923 次 |
最近记录: |