代码之家  ›  专栏  ›  技术社区  ›  salgiza

html5本地应用程序可以有一个asp.net会话吗?(用于iPhone的本地webapp)

  •  5
  • salgiza  · 技术社区  · 14 年前

    上下文:

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

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

    问题是:

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

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

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

    4 回复  |  直到 14 年前
        1
  •  0
  •   Cat Chen    13 年前

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

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

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

        2
  •  0
  •   Ben    13 年前

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

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

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

    作为另一种选择,而不是依赖在线版本的应用程序中的身份验证,另一种可能对您/您的组织有效的方法是在未经身份验证的状态下使用该应用程序,但对移动工作者来说是通过VPN使用的?(作为脱机web应用程序,这仍然可以正常工作)。

        3
  •  0
  •   Linus Unnebäck    13 年前

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

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

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

        4
  •  0
  •   softawareblog.com    9 年前

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