我花了一周的时间在SO和有关身份验证的书籍上,并开始为我的WebAPI推出基本身份验证,以便HTML 客户端可以让用户登录/注册/注销,但是基本身份验证不方便注销,所以我又回到了起点。
细节:
-
我不需要让用户使用其他服务登录。我不需要facebook或google的登录。只是一个用户名/密码。
-
我需要用户能够从客户端应用程序(而不是浏览器)登录/注销/注册。
-
我不介意通过网络发送凭据,因为我将使用SSL。
-
目前只有一个客户端,但会有其他人访问API,所以我需要在未来实现类似于API密钥的东西。也许这是另一个问题。
-
我有一个RESTish WebAPI,接受/返回JSON到其他域的html/js客户端。
-
这是为了原型设计,所以我不需要最好的解决方案,只需要一些足够好的预发布和执行时间较短的东西。
我应该从哪里开始?你会怎么做,为什么?表单验证是一个选项吗?
在问题中
我不介意通过网络发送凭据,因为我将使用SSL。
在你回答的评论中
我只是不希望用户通过网络发送明文密码。
不知道你到底在找什么,但表单认证绝对是一个选项。您也可以使用基本身份验证,但它有一些缺点,如您提到的:不能注销等。您必须使用具有基本身份验证的HTTPS。
如果浏览器弹出是主要问题,您可以通过在第一个请求中先发制人地发送凭据来解决这个问题。通常,第一个请求不带Authorization请求头。服务以401响应,并发送返回表示基本方案的WWW-Authenticate响应头。此时,浏览器弹出对话框,询问用户id和密码,将其打包到基本方案中,并发送授权头。
首先也是更重要的;SSL, SSLSSL这是一个非常简单的步骤,即使是主要网站都遗漏了,但它非常重要(即使SSL目前有许多难以利用的缺陷)。
你可以在webapi中使用几乎任何类型的认证;基本认证;凭证;你可以考虑使用OAUTH风格的身份验证(注意,我说风格是因为规范的定义非常松散,它提供了几乎所有的选择和多种实现方式)。
首先,我会把WebApi作为一个选择;你考虑过别的吗?例如http://www.servicestack.net/,它包含一系列身份验证适配器https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization
其次,知道你的身份验证和它的身份验证是有帮助的(私人数据/上传/访问一些东西);为了得到一个包含"足够安全"的答案。
表单认证'可以'使用,假设你的客户端不是基于浏览器的,你可以实现这一点,通过返回登录通过一个服务和响应与formsauthentication令牌,你需要保持在使用期间的某种上下文中;假设在软件完成使用API后设置了超时,则用户下次必须再次登录才能重用它。
就web api/JS-Html前端而言;引用我自己的话
作为一个JS应用程序,它可能值得快速浏览一下owasp与JS相关的前10名
http://erlend.oftedal.no/blog/?看= 125
A1 - Injection
A2 - Cross Site Scripting (XSS)
A3 - Broken Authentication and Session Management
A4 - Insecure Direct Object References
A5 - Cross Site Request Forgery (CSRF)
A6 - Security Misconfiguration
A7 - Insecure Cryptographic Storage
A8 - Failure to Restrict URL Access
A9 - Insufficient Transport Layer Protection
A10 - Unvalidated Redirects and Forwards
有一篇关于创建WebApi自定义授权过滤器的好文章http://www.west-wind.com/weblog/posts/2013/Apr/18/A-WebAPI-Basic-Authentication-Authorization-Filter (how-to/with code)