【问题标题】:Token authentication and authorisation for a self-hosted ASP.NET Web API 2 REST service自托管 ASP.NET Web API 2 REST 服务的令牌身份验证和授权
【发布时间】:2014-07-02 14:29:09
【问题描述】:

我正在使用 VS2013 和 Web API 2 创建一个自托管(使用 OWIN),使用令牌身份验证通过 SSL 的 RESTful 服务。虽然我不是新手开发人员,但这是我第一次接触 ASP.NET 技术,所以请记住这一点。

除了身份验证和授权部分之外,我的一切都或多或少地工作了。我完全理解对用户进行身份验证(这个用户是谁?)和授权已经通过身份验证的用户访问资源(这个用户可以访问这个特定资源吗?)的区别。

我的身份验证过程的一个非常简单的概述如下(为简洁起见做了一些假设):

  1. 未知客户端连接到 API,例如获取 api/值。
  2. 服务器以 401 响应,此响应标头:“WWW-Authenticate: Token”。
  3. 看到这个后,未知客户端知道要在此处连接到不同的 API 端点:POST api/auth(路由到登录函数),提供用户名和密码。
  4. 服务器将尝试确定这是否是一个有效用户,并根据凭据的有效性接受或拒绝该用户。
  5. (拒绝)服务器返回错误状态代码(403?)。进程结束。
  6. (已接受)服务器创建一个随机令牌(例如 GUID)并将其存储在用户记录中。然后它将令牌发送给客户端。
  7. 现在经过身份验证的客户端重新连接到 API,GET api/values,这一次也提供了令牌。
  8. 用户将资源数据返回给客户端。
  9. ...
  10. 用户可以通过连接到与他登录时相同的 API 来注销:POST api/auth(这一次,他的请求将被路由到 Logout 函数)。这将从服务器中删除令牌,客户端也必须删除自己的令牌。

如您所见,这是一个相对简单的过程,但我找不到任何具体而简单的示例来了解如何使用自托管 Web API 2 最好地实现这一目标。

我不需要注册用户或做任何密码/角色管理等,也没有外部身份验证。所有有效用户都具有访问资源的相同权限,并且它们已经由我无法控制的单独进程在系统中创建(我只能读取他们的凭据以进行验证)。我发现的大多数示例都在谈论我不需要的安全框架,因此我排除了使用以下任何一种:基本身份验证、Windows 身份验证、表单身份验证、个人帐户、ASP.NET 成员资格/身份、OAuth、Thinktecture或任何其他安全框架。

我已阅读有关在消息处理程序中进行身份验证的文章以及有关在自定义 Authorize 属性过滤器中进行身份验证的其他文章,而其他人甚至建议我应该使用新的(在 Web API 2 中)IAuthenticateFilter 属性。这非常令人困惑。您能否建议一种非常简单的方法来实现我的身份验证目标?任何特定的代码示例都将不胜感激,即使它们只是框架实现或伪代码。我只是需要一些想法来帮助我开始。

【问题讨论】:

  • 遵循使用企业协议之一的既定框架具有很大的优势 - 您将来可以轻松地与其他服务/提供商/公司集成。只需对他们说“我的服务使用 oauth2 令牌身份验证”或“我们使用 ws-trust 和 ws-federation”。另一方面,从安全或业务角度来看,自定义安全协议可能被视为潜在问题。我建议然后阅读并遵循以下内容:apress.com/microsoft/asp-net/9781430257820
  • 感谢您的回复,维克托。你说的这本书其实已经订购了!我将编写服务器和(移动)客户端,我将重用其他人编写的代码来创建令牌、哈希等,这些令牌、哈希等已通过多年的 Veracode 扫描进行静态验证。我生成的代码也将以这种方式进行扫描,因此希望它能捕获任何明显的错误。确实,“自己动手”并不总是一个好主意,但由于我不需要管理帐户或连接到外部身份验证提供商,我希望可以将潜在问题降到最低。

标签: asp.net authentication authorization asp.net-web-api2 self-hosting


【解决方案1】:

经过大量谷歌搜索,我在 CodeProject 上找到了这篇文章:http://www.codeproject.com/Articles/630986/Cross-Platform-Authentication-With-ASP-NET-Web-API。虽然这不是 Web API 2 或自托管,但它给了我一些关于如何继续的想法。

有人还对 CodeProject 文章发表了评论,该文章引用了一个 NuGet 包,任何寻找类似内容的人都可能对此感兴趣:https://www.nuget.org/packages/WebApiTokenAuth。就我而言,这有点多。

最后,除了问题中提到的身份验证选项外,如果使用 OWIN 自托管(根据官方 MS 建议),还可以选择编写 OWIN 中间件进行身份验证。但是,我计划使用消息处理程序实现这种特殊形式的令牌身份验证,因为与编写 OWIN 中间件相比,对这种方法的支持更多。

【讨论】:

  • 我遇到了同样的问题,据我所知,在 Web API 2 中没有统一的方式来处理身份验证和授权。决定主要取决于个人喜好和项目要求。
猜你喜欢
  • 2017-01-23
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2013-03-07
相关资源
最近更新 更多