使用WebAPI进行RESTFul身份验证

18

我有一个使用WebAPI构建的web服务,该服务接受JSON请求并做出相应的响应。这个核心架构已经构建好了,但是没有任何身份验证/授权。

经过大量的搜索和参考示例项目后,我不确定从哪里开始。我找到了很多2008年和2009年的资料,但并没有太多关于WebAPI /单页面应用程序的最新指南/工作流程。我认为工作流程应该如下:

  1. 检查用户是否已登录:如何用javascript实现此操作?我需要向我的WebAPI发送Cookie吗?如果是这样,在请求主体中将该Cookie作为参数发送吗?

  2. 让用户登录/注册:此数据如何加密/解密?我肯定不能在网络上传输密码……这是SSL发挥作用的地方吗?

  3. 提供他们可以访问的内容:我想我明白了-我可以根据每个请求在控制器上进行授权。

任何信息都将非常棒。


已排序!谢谢 Evan - SB2055
2个回答

8
基本上您需要基于令牌的身份验证或授权。 如果您正在使用ASP.NET WebAPI,则以下项目是一个很好的起点:http://thinktecture.github.com/Thinktecture.IdentityModel.45/ 即使您不使用ASP.NET WebAPI,以下视频也是介绍如何在RESTful Web服务上提供身份验证/授权的很好的入门介绍:http://vimeo.com/43603474 为了回答您的一些问题:
检查用户是否已登录:这可以通过javascript完成吗?我向我的WebAPI发送Cookie吗?如果是这样,我是否将该Cookie作为请求正文中的参数发送?
您可以使用Cookie,但通常我使用标头来避免常见的XSRF攻击。每当从浏览器发送HTTP请求时,Cookie都会自动包含在其中。
这就是SSL发挥作用的地方吗?
是的。如果您要使用基于令牌的方法,您可以使用单独的服务器(Identity Server)来为您进行身份验证。

他可以使用表单身份验证。基于令牌的身份验证可能有些过度设计了。 - Evan Larsen
1
@EvanLarsen表单身份验证是基于令牌的。 - Snixtor
1
表单认证是否适用于移动设备,例如Android/iPhone/iPad? - bbqchickenrobot
如果您将使用平台上可用的任何http客户端库。在Android中,您应该能够使用HttpUrlConnectionsetRequestProperty()特别有趣。 - yoneal

3

JavaScript客户端非常独特。您的Web API和提供JavaScript的页面是否在同一个域中?如果不是,则存在同源策略限制。如果您拥有同一Web应用程序托管网页和Web API,则可以使用表单Authn。在这种情况下,您无需自己从JavaScript发送包含身份验证票证的cookie。浏览器会为您执行此操作,并且这就是XSRF问题的原因。您必须小心JavaScript发送用户不应知道的凭据。如果JavaScript知道某些内容,任何聪明的最终用户都可以获得那些知识。OAuth 2.0隐式授权可能是一个不错的选择。最终用户在授权服务器中输入凭据(密码),该服务器发出访问令牌。JavaScript获取令牌并将其呈现给Web API,但它永远不会访问凭据。


谢谢Badri。JS客户端位于不同的域中 - 客户端和API是解耦的。话虽如此,您对基本身份验证+SSL有何想法? - SB2055
1
JavaScript客户端(浏览器)+即使在SSL上的基本身份验证也容易受到XSRF攻击。您可以使用类似Thinktecture身份服务器的东西来发放OAuth 2.0隐式授权的令牌。JavaScript客户端可以通过这种方式请求访问令牌,并以承载方案的形式呈现给Web API。那将是我的首选。您可以使用基本身份验证,但然后您必须使所有对API的GET请求无效,并可能保护其他方法,就像他们为MVC实现防伪标记一样。我的书涵盖了此选项。 - Badri
非常感谢您的快速回复。您的书刚刚送到了我的门口 - 我期待着深入研究它。 - SB2055

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接