使用 WebAPI 进行 RESTFul 身份验证
Posted
技术标签:
【中文标题】使用 WebAPI 进行 RESTFul 身份验证【英文标题】:RESTFul Authentication with WebAPI 【发布时间】:2013-03-25 22:07:53 【问题描述】:我有一个使用 WebAPI 构建的 Web 服务,它接受 JSON 请求并做出相应的响应。核心架构已构建,但没有任何身份验证/授权。
经过大量谷歌搜索和浏览示例项目后,我不知道从哪里开始。我发现了 2008 年和 2009 年的大量材料,但没有找到很多 WebAPI/单页应用程序的最新指南/工作流程。我认为工作流程应该如下:
检查用户是否已登录:如何使用 javascript 来完成?我是否将 cookie 发送到我的 webAPI?如果是这样,我是否将该 cookie 作为请求正文中的参数发送?
让用户登录/注册:这些数据是如何加密/解密的?当然,我不能通过网络发送密码……这就是 SSL 的用武之地吗?
让他们可以访问他们有权访问的内容:我想我明白了 - 我可以根据每个请求在控制器中进行授权。
任何信息都会很棒。
【问题讨论】:
最近刚出版了一本关于这方面的好书:amazon.com/Pro-ASP-NET-Web-API-Security/dp/1430257822/… 已订购!谢谢埃文 【参考方案1】:基本上,您需要基于令牌的身份验证或授权。 如果您指的是 ASP.NET WebAPI,以下项目将是一个很好的起点: http://thinktecture.github.com/Thinktecture.IdentityModel.45/
即使您不使用 ASP.NET WebAPI,以下视频也很好地介绍了如何在 RESTful Web 服务上提供身份验证/授权: http://vimeo.com/43603474
回答您的一些问题:
检查用户是否已登录:如何使用 javascript 完成此操作?我是否将 cookie 发送到我的 webAPI?如果是这样,我是否将该 cookie 作为请求正文中的参数发送?
您可以使用 cookie,但我通常使用标头来避免常见的 XSRF 攻击。每当从浏览器发送 http 请求时,都会自动包含 Cookie。
这就是 SSL 的用武之地吗?
是的。如果您打算继续使用基于令牌的方法,您可以使用单独的服务器(身份服务器)为您进行身份验证。
【讨论】:
或者他可以只使用表单身份验证。基于令牌的身份验证可能是矫枉过正 @EvanLarsen Forms 身份验证是基于令牌的。 Woudl 使用移动设备形成身份验证工作 - 即 - android/iphone/ipad? 如果您将使用平台中可用的任何 http 客户端库。在android中,你应该可以使用HttpUrlConnection。setRequestProperty()
会特别有趣。【参考方案2】:
JavaScript 客户端是独一无二的。您是否在同一个域中拥有 Web API 和提供 JavaScript 的页面?如果不是,则您有同源策略限制。如果您拥有托管网页和 Web API 的相同 Web 应用程序,则可以使用表单 Authn。在这种情况下,您不需要自己从 JavaScript 发送包含身份验证票的 cookie。浏览器会为您执行此操作,这就是 XSRF 问题的原因。您必须小心 JavaScript 发送最终用户不应该知道的凭据。如果 JavaScript 知道一些东西,任何聪明的最终用户都可以得到这些知识。 OAuth 2.0 隐式授权可能是一个不错的选择。最终用户在颁发访问令牌的授权服务器中输入凭据(密码)。 JavaScript 获取令牌并将其呈现给 Web API,但它永远无法访问凭据。
【讨论】:
谢谢巴德里。 JS 客户端位于不同的域中 - 客户端和 API 是分离的。也就是说,您对基本身份验证 + SSL 有何看法? JavaScript 客户端(浏览器)+ Basic Authn 即使通过 SSL 也容易受到 XSRF 的影响。您可以使用 Thinktecture 身份服务器之类的东西通过 OAuth 2.0 隐式授权发布令牌。 JavaScript 客户端可以通过这种方式请求访问令牌,并以承载方案将其呈现给 Web API。那将是我的第一选择。您可以使用 Basic Authn,但是您必须使所有对您的 API 的 GET 请求无效,并且可能以某种方式保护其他方法,例如他们如何为 MVC 实现防伪令牌。我的书涵盖了这个选项。 非常感谢您的快速回复。你的书刚刚送到我家门口 - 我期待着深入研究它。以上是关于使用 WebAPI 进行 RESTFul 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Firebase 规则进行身份验证(RESTful)
使用 RESTful 身份验证插件进行 Ruby on Rails 功能测试
使用 Asp.Net 下的 owin 和 LinkedIn 身份验证提供程序进行 WebApi 身份验证