50

我正在设计一个有移动伴侣的网站(最初只有 iPhone)。该网站将是一个 ASP.Net MVC 3 应用程序。我还将有一个 ASP.Net Web API 站点 (MVC 4) 来向 iPhone 应用程序公开服务。iPhone 应用程序将有自己的表单来捕获用户的用户名和密码,并将其发送到 JSON 标头中的 Web API。

我想从一开始就考虑安全性,而不是事后考虑。无论如何,我都不是安全专家。我已经进行了大量研究,以了解其他人如何处理来自 Web 服务的移动应用程序客户端的身份验证。我想我已经想出了一个不错的解决方案,它不涉及连接到第三方 oAuths。

我将非常感谢你们任何人可以提供的任何和所有意见、建议、批评和一般 WTF。:)

我最大的担忧是:

  1. 确保对 Web API 的调用得到授权
  2. 最大限度地降低重放攻击的风险(因此在下面的调用中使用时间戳)

iPhone 应用程序将这样开发:
两个字符串被硬编码到 iPhone 应用程序中(每个用户的值相同):

  1. 应用程序 ID
    这是一个字符串,用于识别访问 Web API 的客户端类型(iPhone、Android、Windows 手机等)。

  2. 应用程序的哈希加盐
    这是一个字符串,用于为与用户无关的请求加盐哈希。

两个字符串存储在 iPhone 应用程序的本地数据库中(每个用户唯一的值):

  1. API 用户访问令牌
    这是 Web API 在成功验证后提供给客户端的字符串(令牌),允许客户端访问 Web API,而无需在每个请求中发送用户名和密码。
  2. User's Hashing Salt
    这是一个字符串,用于对针对已建立用户帐户的请求进行加盐哈希。



iPhone 将通过以下方式调用 Web API:

API 方法:创建帐户
客户端发送:

  • 新帐户数据(用户名、密码、名字、姓氏等)
  • 应用程序 ID
  • UTC 时间戳
  • UTC 时间戳的哈希值 + 应用程序的哈希盐加盐的应用程序 ID

API 返回:

  • 新用户的散列盐

    这里的想法是,在创建帐户时,我可以使用应用程序的硬编码盐,因为如果盐泄露(通过反编译或其他方式)不会带来巨大的安全风险。

    但是对于访问和修改用户数据的方法,我将使用仅由该用户拥有的盐,因此攻击者不能使用它来冒充他人。


API 方法:获取帐户
(用于获取用户在网站上创建但尚未在 iPhone 上同步的帐户的哈希盐。当用户尝试在 iPhone 上登录并且 iPhone 检测到它有该用户名没有记录。)

客户发送:

  • 用户名
  • 密码(使用应用程序的哈希盐进行哈希处理)
  • 应用程序 ID
  • UTC 时间戳
  • UTC 时间戳的哈希值 + 应用程序的哈希盐加盐的应用程序 ID

API 返回:

  • 现有用户的哈希盐


API 方法:登录(验证)
客户端发送:

  • 用户名
  • 密码(使用用户的哈希盐进行哈希处理)
  • 应用程序 ID
  • UTC 时间戳
  • UTC 时间戳的哈希值 + 使用用户的哈希盐加盐的应用程序 ID

API 返回:

  • API 用户访问令牌


API 方法:任何命令(即创建帖子、更新配置文件、获取消息等)
客户端发送:

  • 命令数据
  • API 用户访问令牌
  • 应用程序 ID
  • UTC 时间戳
  • UTC 时间戳的哈希值 + 应用程序 ID + API 用户访问令牌用用户的哈希盐加盐
4

3 回答 3

4

我使用 asp.net mvc 4.0/web api 基本会员资格做到了。您可能会发现它很有帮助。

是的,肯定使用 SSL

https://github.com/aamir-poswal/Mobile-Apps-Authentication-Authorization-ASP.NET-WEB-MVC-4.0

于 2013-08-24T10:17:39.913 回答
4

在 VS 2013 中,您可以使用“Asp MVC SPA 应用程序”模板生成一个工作实现,该实现在登录时生成 Oauth2 令牌承载并使用 [Authorize] 属性为 WebApi 控制器调用授权。它使用成员资格和实体框架在 SQL Server 中本地存储用户和散列。只需删除您不需要的 asp mvc 部分并保留 WebApi 的 Auth 部分。更多详细信息:http: //msdnrss.thecoderblogs.com/2013/09/understanding-security-features-in-the-spa-template-for-vs2013-rc/

于 2013-11-20T19:56:30.417 回答
3

我的建议

  1. 身份验证和授权。在 2 个不同的服务器上构建它(在某些项目中我也使用了 3 个)。反向代理服务器非常适合这一点。在一台服务器上进行身份验证并在另一台服务器上授权。

这是我认为在使用 Web API 的移动安全中最重要的一步。

  1. 封装一切。

  2. 对所有安全信息使用 SSL。就我而言,我将它用于一切。

  3. 对于您的时间戳,请选择您可以获得授权的合适时间。不要把它写得很短,因为网络嗅探器可以访问数据包,您的应用程序会变慢或过长。

如果您想要一个 3 服务器架构 对于您的请求,您还需要一个应用程序密钥,用于生成访问密钥(来自服务器 1)。此访问密钥将验证您的请求,在成功验证后(来自服务器 2),您可以使用该密钥授权来自另一台服务器(服务器 3)的请求

您提到的要求是标准规范。真的看不出有什么问题。

于 2012-08-09T20:33:23.567 回答