【问题标题】:Architecture for Authentication/Authorization of Mobile and Web Users移动和 Web 用户的身份验证/授权架构
【发布时间】:2011-05-11 04:50:31
【问题描述】:

这对我来说似乎是一个反复出现的问题,因为过去几年我似乎被移动应用程序所吸引。除了网络用户之外,我还想对移动用户进行身份验证和授权。我需要做到这一点足够无缝,以便用户可以轻松地拥有一个网络帐户,而不会中断他们的数据。我希望解决方案在主题上具有架构性,而不是特定于任何语言/框架。

要求/假设

  1. 移动用户必须能够在不登录的情况下使用本机应用程序,包括贡献内容(标记收藏夹、上传照片等)。
  2. 即使没有指定帐户凭据,移动用户也应该安全且唯一地对 Web 服务进行身份验证。
  3. 移动用户可能有多个设备,这些设备彼此不知道。
  4. 移动用户应该能够注册/登录,这应该将任何内容滚动到帐户的所有权中。这种“同步”应该发生在随后登录的每个帐户中。
  5. 帐户是在移动设备还是网络上创建的都无关紧要。

考虑的架构

  1. 没有衬衫,没有鞋子,没有登录 = 没有贡献。需要登录才能贡献任何类型的内容。这避免了将设备帐户与主帐户“同步”的需要。只需一个用户名/密码 + 令牌即可让设备登录。服务器对象:用户、角色
  2. 多设备自认证。 服务器与设备协商并将其交给设备存储的凭据。每个设备都会进行自我验证并与一个匿名帐户相关联,直到发生注册/登录。如果发生注册,则将匿名帐户转换为已知帐户。如果发生登录,来自匿名帐户的内容将被转移到已知帐户,然后被丢弃。丢失自我身份验证详细信息的设备将获得新的身份验证详细信息,并且先前的匿名帐户被放弃(然后希望以后被丢弃)并且不可恢复,因为它从未转换为已知帐户。服务器对象:用户、角色、设备

您认为什么是好的解决方案?是其中之一,还是其他?

【问题讨论】:

    标签: web-services authentication architecture mobile authorization


    【解决方案1】:

    一种解决方案是使用生物识别技术。如果移动设备具有生物识别传感器,例如指纹读取器,用户将在购买时向设备注册生物识别(仅出于隐私问题)。可以编写应用程序,使每个安全交易都要求用户对生物特征进行身份验证。

    这似乎并不太遥远。摩托罗拉 Atrix 有一个指纹传感器...

    【讨论】:

    • 此回复并未真正解决所展示的帖子。当然,生物识别技术可以帮助识别用户,但将该设备和用户身份验证连接到后端仍需要一些设计考虑。我还没有找到完美的解决方案。
    【解决方案2】:

    我认为这是从错误的方向来看。将服务器上的身份定义为由任意值定义。可能只是一个数据库序列。将任何人口统计信息(姓名、电子邮件...)和使用历史记录与此身份相关联。

    另外,在服务器上定义一个身份验证实体。这可能是用户/密码。它可能是设备 GUID/UUID。它可以是像 OpenID 这样的联合 ID。给定的身份可以(并且在您的用例中通常会)具有多个关联的身份验证实体。很可能有多个相同类型的身份验证身份。 (例如,我的智能手机的 GUID,我的 iPad 的 GUID...)

    您的前端(无论是基于网络的还是基于应用的)使用定义的 API 来验证用户身份;使用前端支持的任何一种机制。

    在某些情况下(尤其是原生应用),未知 ID 的呈现会触发新身份的创建。但是,正如有人指出的那样,在这种情况下,您应该询问用户是否要连接到现有身份。他们需要提供身份验证作为该身份(一次)以建立该连接。

    另外一点,无论服务器使用什么来唯一指定一个身份,都应该是一个从不提供给客户端的值。客户端只知道身份验证机制及其数据。即GUID/UUID、用户名/密码、...

    除了上面列出的技术之外,OAuth 之类的技术比本地生成的 GUID 更安全。这些是a:容易确定或b:容易丢失之一。如果该值是高度可预测的(例如电话号码),则很容易被欺骗。如果它是在运行时生成的,并且包含一个难以预测的值,例如首次生成时的当前时间的哈希值,那么它必须存储在设备上,并且如果设备被擦除,很容易丢失。可以生成良好的 GUID,但它们通常是特定于设备类型的。诸如从 ROM、IMEI 检索的设备序列号之类的东西……这是很容易做到的。但是,它对特定设备的依赖性比我想象的要大得多。

    我在整个方法中看到的最大真正障碍是,让现有的仅设备(无用户名/密码)用户坐在 PC 浏览器前并连接到他现有的帐户会很尴尬。

    【讨论】:

    • 我真的很喜欢你的思路。我不确定它是否真的说明了解决此特定问题的常用技术,但我非常感谢您的回复。 (请注意,我早在 2010 年就读过此回复,但现在我觉得有必要让您知道它很受赞赏和有用)
    【解决方案3】:

    我想提出一个类似于2的想法。

    为每个移动设备生成一个 UUID。当用户生成内容并将内容发送到服务器时,它将用于在以后发生时识别设备。

    如果用户想在以后的任何时间创建一个网络帐户,他可以在网络或设备上注册。如果用户已经拥有一个网络帐户,他可以选择在他的移动设备上提供一次(或多个设备)上的现有凭据,并且该设备在服务器端链接到他的网络帐户。

    在服务器端,我将允许两种不同类型的实体用作身份:通过凭据进行身份验证的 Web 用户(我想到的是 OpenID 作为补充)和通过其 GUID 进行身份验证而不受用户干扰的设备。自然地,一个网络用户实体可能拥有多个设备实体。当用户选择将他的设备链接到现有帐户时,设备实体将链接到帐户。内容通常与身份相关联。

    保持用户和设备之间的联系,也可以用于显示内容的来源。

    您无需使用为移动用户生成的凭据创建/删除/转换帐户。您也不需要将凭据存储在移动设备上。

    根据您的应用程序上下文的重要性,仍有一些安全注意事项未解决。如果没有任何安全措施,攻击者会发现很容易滥用 UUID。

    【讨论】:

      【解决方案4】:

      数字 2 足以作为基本决策。用户讨厌注册;)因此无需注册即可使用服务是个好主意。

      您可以使用 GUID/UUID 来识别设备。并在用户登录之前将其用作匿名登录。

      但是如果 2 人(或更多)人使用 1 台设备怎么办?或者设备会丢失、被盗? 我认为没有任何一点涵盖这些情况。

      我不知道您构建了哪种 Web 服务,因此无法提供更多建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-06
        • 2011-03-17
        • 2013-10-02
        • 1970-01-01
        • 2016-01-12
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多