【问题标题】:Can a html5 local app have an asp.net session? (local webapp for iPhone)html5 本地应用程序可以有 asp.net 会话吗? (适用于 iPhone 的本地网络应用程序)
【发布时间】:2015-02-10 20:18:04
【问题描述】:

上下文:

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

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

问题:

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

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

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

【问题讨论】:

    标签: iphone asp.net-mvc html mobile-safari


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但不幸的是我说的是 HTML5 离线应用程序。它们是 HTML 页面,可以存储在手机中,可以离线工作,在工作区中有自己的图标,并且表现得像原生应用程序(你没有浏览器 chrome)。
    【解决方案2】:

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

    Mobile Safari 使用的网络引擎与“主屏幕应用程序”(即您在 iOS 主屏幕上作为独立图标添加书签的网页)中使用的网络引擎略有不同。

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

    作为替代方案,不是依靠应用程序的在线版本中的身份验证,另一种可能适用于您/您的组织的方法是在未经身份验证的状态下使用应用程序,但通过移动工作人员的 VPN? (这仍然可以作为离线网络应用运行)。

    【讨论】:

    • 感谢您的回答。实际上,这是处理主屏幕应用程序的方式的问题。现在他们在 Mobile Safari 中使用该应用程序,但理想情况下,他们应该能够从图标中使用它(屏幕状态在移动设备中很重要,我们不需要浏览器栏来做任何事情)。
    • 嗯......应该有一种方法可以在评论中添加新行,但我离题了。我们应该使用 VPN(加密连接),但也需要 cookie 会话,因为我们将值存储在服务器会话中(并且我们需要知道出于不同原因访问应用程序的用户的身份)。如果将来有时间,我们可能会使用验证令牌(基本上,它类似于 cookie,但每次 Ajax 调用都会显式发送)。
    【解决方案3】:

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

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

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

    【讨论】:

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

    您最好的选择: 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,你必须生成自己的token并放入每个请求数据中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多