一个基于HTML5的本地应用程序能够拥有ASP.NET会话吗?(针对iPhone的本地Web应用程序)

5

背景:

我正在开发一个小型Web应用程序(C#/MVC2),用户将使用他们的iPhone(也可能是Android手机)来访问它。

目前它非常简单(只显示一些信息和客户ERP的报告),我决定尝试创建本地Web应用程序,使用户可以将其添加到他们的iPhone上,这样他们就有了一个图标,并且最重要的是,大多数文件都是本地缓存的,因此只需使用json从服务器获取相关数据。

问题:

为了验证用户身份,一个小表单请求用户名和密码,并通过ajax将它们发送到服务器,服务器会验证用户并设置authcookie。如果在Safari中执行该应用程序,则一切正常,但如果在本地执行该应用程序(即在Mobile Safari中直接从图标中执行),则当下一次ajax调用以恢复数据时,服务器正确验证用户,但此验证就会丢失。

这是否意味着移动Safari不支持Web应用程序中的会话Cookie?我做错了吗?

最重要的是:在访问远程数据的本地Web应用程序中,什么是最好的用户身份验证方式?

4个回答

0

最好的选择: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

要访问受保护的资源,客户端需要在HTTP请求的Authorization头部中包含访问令牌。

登录:

var loginData = {
    grant_type: 'password',
    username: ...,
    password: ...
};

$.ajax({
    type: 'POST',
    url: '/Token',
    data: loginData
}).done(function (data) {
    // Cache the access token in session storage.
    sessionStorage.setItem(tokenKey, data.access_token);
});

第二个请求:
// If we already have a bearer token, set the Authorization header.
var token = sessionStorage.getItem(tokenKey);
var headers = {};
if (token) {
    headers.Authorization = 'Bearer ' + token;
}

$.ajax({
type: 'GET',
url: 'api/values/1',
headers: headers
}).done(function (data) {});

如果您不打算使用Web API,则必须生成自己的令牌并将其放入每个请求数据中。


0

你可以使用 AJAX 调用登录接口,而不是使用 cookie。该接口将返回“authcookie”值,你可以使用 localStorage 或类似的方式保存该值。

http://dev.w3.org/html5/webstorage/

稍后当您想要获取某些内容时,您可以使用自定义标头(X-authentication或类似标头)将此值发送到服务器,或者只需将其附加为GET变量到URL中。


谢谢,我们已经在应用程序中使用了许多本地存储。问题是,在 .Net MVC(以及大多数其他地方)中,使用基于 cookie 的会话是授权用户的标准方式。创建自己的基于令牌的系统不应该太难(我们将来可能会这样做),但很奇怪的是本地 Web 应用程序(在 iPhone 上)不支持 cookie(因此不支持基于 cookie 的会话)。 - salgiza

0

我意识到我回答这个问题已经很晚了,但是无论如何...

移动Safari使用与在iOS主屏幕上作为自包含图标书签的“主屏幕应用程序”中使用的Web引擎略有不同。

也许你在cookie方面遇到的问题来自于此,而不是Mobile Safari 本身?我想测试很容易:如果应用在Mobile Safari中完全正常工作,但在主屏幕图标中不起作用,那么就找到了答案。

作为另一种选择,与其依赖在线版本应用程序中的身份验证,您/您的组织可能会采用另一种方法,即在未经身份验证的状态下使用VPN进行移动工作人员的应用程序?(这仍将作为离线Web应用程序正常工作)。


感谢您的回答。实际上,这是与主屏幕应用程序处理方式有关的问题。现在它们正在使用移动 Safari 中的应用程序,但理想情况下,它们应该能够从图标中使用它(在移动设备中,屏幕状态很重要,我们不需要浏览器栏)。 - salgiza
嗯...应该有方法在注释中添加新行,但我偏离了主题。我们应该使用 VPN(加密连接),但也需要 cookie 会话,因为我们在服务器会话中存储值(我们需要知道访问应用程序的用户身份以进行不同的操作)。如果将来还有时间,我们可能会采用验证令牌(基本上类似于 cookie,但是随着每个 Ajax 调用显式发送)。 - salgiza

0

我不太确定你所说的"本地webapp"具体指的是什么。我猜想它是在本地主机上运行的HTTP网页服务器。

如果是这种情况,你需要一些协议来在http://localhosthttp://yourwebsite.com之间进行通信,并且该协议应该帮助本地主机通过yourwebsite.com来进行用户认证。我认为OAuth可能是你正在寻找的。

当用户首次访问你的本地webapp时,他将被重定向到yourwebsite.com进行身份验证。之后,yourwebsite.com会返回一个OAuth token给他。在从yourwebsite.com验证该token有效后,本地主机可以自己为用户提供服务。


谢谢,但不幸的是我在说HTML5离线应用。它们是可以存储在手机中的HTML页面,可以脱机工作,在工作区有自己的图标,并且表现出类似本地应用的行为(您不会看到浏览器界面)。 - salgiza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接