2010-09-08 63 views
5

上下文:html5本地应用程序可以有一个asp.net会话吗? (适用于iPhone的本地Web应用程序)

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

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

问题:

为了验证用户,小形状询问用户名和密码,并将它们发送到通过AJAX服务器,这反过来验证用户并设置authcookie。如果应用程序在Safari中执行,则一切正常,但如果它是在本地执行的(即直接通过图标在Mobile Safari中),则服务器会正​​确验证用户,但在下一次调用恢复数据的Ajax调用时会丢失验证被制成。

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

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

回答

0

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

如果是这样的话,您需要一些协议在http://localhosthttp://yourwebsite.com之间进行通信,该协议应该有助于localhost通过yourwebsite.com对用户进行身份验证。我认为OAuth可能就是您要找的。

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

+0

谢谢,但不幸的是我在谈论HTML5离线应用程序。它们是可以存储在手机中的HTML页面,可以脱机工作,在工作区中有自己的图标,并且像本地应用程序一样运行(您不会看到Chrome浏览器)。 – salgiza 2011-02-24 08:16:24

0

(我知道我很迟了这个问题,但无论如何...)

移动Safari浏览器采用了略有不同的网络引擎,在“主屏幕应用程序”(即用于网页的你书签作为独立的图标在iOS主屏幕上)。

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

作为另一种选择,不是依赖应用程序的在线版本中的身份验证,另一种可能适用于您/您的组织的方法是以未经身份验证的状态使用该应用程序,但通过移动员工的VPN ? (这将仍然可以作为一个离线的网络应用程序确定)。

+0

感谢您的回答。实际上,这是处理主屏幕应用程序的一个问题。目前他们正在使用移动Safari中的应用程序,但理想情况下他们应该能够使用它从一个图标(屏幕状态在移动设备中很重要,我们不需要任何浏览器栏)。 – salgiza 2011-06-16 07:44:40

+0

嗯......应该有办法在评论中添加新行,但我离题了。我们应该使用VPN(加密连接),但也需要cookie会话,因为我们将值存储在服务器会话中(并且我们需要知道用户因不同原因访问应用程序的身份)。如果将来有时间的话,我们可能会使用验证令牌(基本上,它将类似于cookie,但是会在每次Ajax调用时显式发送)。 – salgiza 2011-06-16 07:52:42

0

而不是使用cookie不能有一个ajax调用登录,只是返回“authcookie”值。该值可以使用localStorage或类似的方法保存。

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

后来,当你想获取的东西,你可以将此值发送到使用自定义标题(X-认证或类似的)或只是追加它作为一个GET变量到URL服务器。

+0

这个网站可能会帮助你开始:http://diveintohtml5.org/storage.html – 2011-06-24 09:37:16

+0

谢谢,我们已经在应用程序中使用localstorage许多事情。问题是使用基于cookie的会话是在.Net MVC(主要是其他地方)授权用户的标准方式。创建我们自己的基于令牌的系统应该不会太难(我们将来可能会这样做),但是本地Web应用程序(在iPhone中)不支持cookie(以及基于cookie的会话) 。 – salgiza 2011-06-27 13:58:16

0

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

访问受保护的资源,客户端包含在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,你必须生成你自己的令牌,并把它放在每个请求的数据