我在asp.net mvc中构建了一个REST API。我的系统使用表单认证。用户名/密码或openId/fbconnect等。如果我在动作上拥有[Authorize]
属性,那么Android应用或桌面应用如何访问该方法?使用REST API进行身份验证
或者更好的问题是,我将如何设计桌面应用程序进行身份验证?我需要传递一个API密钥还是某种类型的令牌?或者,桌面应用程序的行为如同浏览器并使用内部cookie?我不太确定RESTful API如何在具有认证的Web浏览器之外工作。
我在asp.net mvc中构建了一个REST API。我的系统使用表单认证。用户名/密码或openId/fbconnect等。如果我在动作上拥有[Authorize]
属性,那么Android应用或桌面应用如何访问该方法?使用REST API进行身份验证
或者更好的问题是,我将如何设计桌面应用程序进行身份验证?我需要传递一个API密钥还是某种类型的令牌?或者,桌面应用程序的行为如同浏览器并使用内部cookie?我不太确定RESTful API如何在具有认证的Web浏览器之外工作。
我不会在REST API中使用cookie。 FormsAuthentication是一个基于cookie的方法。相反,调用者应该为头中的每个请求提供认证凭证,或者作为请求参数。例如,您可以使用基本身份验证来传输用户名和密码,或者添加带有一些加密访问令牌(这不是非常RESTful)的自定义身份验证头。您也可以实施OAuth,其中请求者将为每个请求提供一个访问令牌。
我会写一个自定义的AuthorizeAttribute
在您的代码中执行身份验证,这会给您很多控制权。或者,您可以使用控制器基类并覆盖OnAuthorization
方法。
API不应提供密码挑战:在Web应用程序中,未经授权的请求通常会将用户重定向到登录页面。在API中,请求只会返回错误代码。现在,客户端应用程序的工作是通过对话框来挑战用户(如果适用)。在移动应用中,您可能想要显示对话框。在使用OAuth的Web应用程序中,您可能需要重定向到身份验证服务器。
如果你想测试你的REST API,我建议你使用REST Console for Google Chrome和cURL。前者对初学者来说更简单,并带有一个漂亮的GUI,而cURL则为您提供更多保真度和多种协议。
编辑
一个有点迂腐注:某些API,即使是那些相当大的供应商,例如Twitter,不时返回401
状态代码,通常省略(强制性)WWW-Authenticate
标题,因为它不是要向客户挑战。
查看亚马逊AWS认证方案。它可以满足大多数人的需求,它使用标准的HTTP授权标头。
对于Chrome浏览器的REST控制台+1,提及:)好的! –
'我不会在REST API中使用cookie' - 同意,但是,您可以使用它来生成一个安全的令牌,就像[这个答案]一样(http://stackoverflow.com/questions/840537/generating-cryptographically-安全认证的令牌#858724)。 – James
@詹姆斯:这是一个很好的观点。使用一个令牌肯定会更好,而不是一直发送用户名和密码,因为这样更容易隔离样板代码。 – mnemosyn