html5本地应用程序是否可以使用asp.net会话?(适用于iPhone的本地webapp)

html5本地应用程序是否可以使用asp.net会话?(适用于iPhone的本地webapp),iphone,asp.net-mvc,html,mobile-safari,Iphone,Asp.net Mvc,Html,Mobile Safari,上下文: 我实际上正在开发一个小型web应用程序(C#/MVC2)。用户将使用他们的iPhone(将来可能还有Android手机)访问它 目前它非常简单(它只显示了我们客户ERP中的一些信息和报告),我决定尝试创建本地webapp,用户可以将其添加到iPhone中,这样他们就有了一个图标,最重要的是,大多数文件都在本地缓存,因此,使用json只从服务器获取相关数据 问题: 为了对用户进行身份验证,一个小表单要求输入用户名和密码,并通过ajax将它们发送到服务器,服务器反过来验证用户并设置auth

上下文:

我实际上正在开发一个小型web应用程序(C#/MVC2)。用户将使用他们的iPhone(将来可能还有Android手机)访问它

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

问题:

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

这是否意味着webapps中的Mobile Safari不支持会话cookie?我做错了


最重要的是:在访问远程数据的本地webapp中,对用户进行身份验证的最佳方法是什么?

我不太清楚您所说的本地webapp是什么意思。我假设它是在本地主机上运行的HTTP web服务器

如果是这种情况,您需要一些协议在和之间进行通信,该协议应该有助于localhost通过yourwebsite.com对用户进行身份验证。我想OAuth可能就是你要找的

用户第一次访问您的本地webapp时,他将被重定向到yourwebsite.com进行身份验证。之后,yourwebsite.com会给他带回一个OAuth代币。从yourwebsite.com验证令牌有效后,localhost可以自己为用户服务。

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

Mobile Safari使用的web引擎与“主屏幕应用”(即在iOS主屏幕上将网页标记为独立图标)中使用的web引擎略有不同

也许你看到的Cookie问题来自于此,而不是移动Safari本身?我想这很容易测试:如果应用程序在Mobile Safari中运行正常,而不是在主屏幕图标上运行,那么答案就在这里


作为一种替代方案,您/您的组织可能采用的另一种方法是在未经身份验证的状态下使用应用程序,而不是依赖于应用程序在线版本中的身份验证,而是通过VPN为移动工作者使用应用程序?(这仍然可以作为脱机web应用程序使用)。

不能使用cookie,而只返回“authcookie”值的ajax登录调用。可以使用localStorage或类似工具保存该值

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

您的最佳选择:

要访问受保护的资源,客户端包括访问令牌 在HTTP请求的授权标头中

登录:

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,您必须生成自己的令牌并将其放入每个请求数据中

谢谢,但不幸的是,我说的是HTML5离线应用程序。它们是HTML页面,可以存储在手机中,可以脱机工作,在工作区中有自己的图标,并且像本机应用程序一样运行(你没有浏览器chrome)。谢谢你的回答。实际上,主屏幕应用程序的处理方式存在问题。目前,他们正在Mobile Safari中使用该应用程序,但理想情况下,他们应该能够通过图标使用该应用程序(屏幕状态在移动设备中很重要,我们不需要任何浏览器栏)。嗯。。。应该有办法在评论中添加新行,但我离题了。我们应该使用VPN(加密连接),但也需要cookie会话,因为我们在服务器会话中存储值(并且我们需要知道出于不同原因访问应用程序的用户的身份)。如果将来有时间,我们可能会使用验证令牌(基本上,它类似于cookie,但每次Ajax调用都会显式发送)。谢谢,我们已经在应用程序中使用localstorage进行了很多操作。问题是使用基于cookie的会话是.NETMVC(以及大多数其他地方)中授权用户的标准方式。创建我们自己的基于令牌的系统应该不会太难(将来我们可能会这么做),但本地web应用(在iPhone中)不支持cookie(因此也不支持基于cookie的会话),这很奇怪。