使用REST API进行身份验证

7
我正在使用asp.net mvc构建REST API。我的系统使用表单身份验证,包括用户名/密码或OpenID/fbconnect等方式。如果我在一个动作上使用[Authorize]属性,那么安卓应用程序或桌面应用程序如何访问该方法?
或者更好的问题是,我应该如何设计桌面应用程序进行身份验证?我需要传递API密钥或某种令牌吗?还是桌面应用程序会像浏览器一样使用内部cookie?我不太确定在身份验证之外,RESTful API如何在Web浏览器之外工作。
2个回答

14

我不建议在REST API中使用cookies。FormsAuthentication是基于cookies的方法。相反,调用者应该在头信息或请求参数中提供身份验证凭据。

例如,您可以使用基本身份验证传输用户名和密码,或添加一个自定义身份验证头并提供一些加密的访问令牌(这不太符合RESTful的原则)。您还可以实现OAuth,其中请求方将在每个请求中提供访问令牌。

我会编写一个自定义AuthorizeAttribute来执行代码中的身份验证,这样您就有了很多控制权。或者,您可以使用控制器基类并覆盖OnAuthorization方法。

API不应该提供密码验证:在Web应用程序中,未经授权的请求通常会将用户重定向到登录页面。在API中,请求将只返回错误代码。现在,客户端应用程序的工作是通过对话框挑战用户(如果适用)。在移动应用程序中,您可能需要显示对话框。在具有OAuth的Web应用程序中,您可能要重定向到身份验证服务器。

如果您想测试REST API,我建议您使用Google Chrome的REST ConsolecURL。前者适合初学者,带有漂亮的图形用户界面,而cURL则提供更多的灵活性和协议支持。

编辑

有一个有点迂腐的注意事项:一些API,甚至是一些相当大的供应商的API(例如Twitter),不时返回401状态码,通常省略了(强制)WWW-Authenticate头,因为他们并不想挑战客户端。


+1 给 Google Chrome 的 REST Console,赞一个 :) 很不错! - Pure.Krome
1
“我不会在REST API中使用cookies” - 同意,但是您可以像这个答案中所述使用它来生成安全令牌。 - James
@James:这是一个非常好的观点。使用令牌而不是一直发送用户名和密码肯定更好,因为这样更容易隔离样板代码。 - mnemosyn

1

看看亚马逊的AWS身份验证方案。它做了大多数人想要的事情,并且使用标准的HTTP授权头。


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