自签名ASP.NET Web API 2 REST服务的令牌身份验证和授权

时间:2014-05-14 13:36:20

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

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

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

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

  1. 未知客户端连接到API,例如GET api / values。
  2. 服务器响应401和此响应标头:“WWW-Authenticate:Token”。
  3. 看到这个,未知客户端知道在这里连接到不同的API端点:POST api / auth(路由到Login功能),提供用户名和密码。
  4. 服务器将尝试确定这是否是有效用户,并且可以接受或拒绝用户,具体取决于凭据的有效性。
  5. (已拒绝)服务器返回错误状态代码(403?)。流程结束。
  6. (已接受)服务器创建随机令牌(例如GUID)并将其存储在用户记录中。然后它将令牌发送给客户端。
  7. 现已验证的客户端重新连接到API,GET api / values,这次也提供令牌。
  8. 用户将资源数据返回给客户端。
  9. ...
  10. 用户可以通过连接到用于登录的相同API来注销:POST api / auth(这次,他的请求将被路由到Logout功能)。这将从服务器中删除令牌,客户端也必须删除自己的令牌。
  11. 正如您所看到的,这是一个相对简单的过程,但我找不到任何具体而简单的示例来了解如何使用自托管Web API 2实现此目标。

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

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

1 个答案:

答案 0 :(得分:9)

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

有人还发表了对引用NuGet包的CodeProject文章的评论,该文章可能会让任何寻找类似内容的人感兴趣:https://www.nuget.org/packages/WebApiTokenAuth。在我的情况下,它有点多。

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