ASP.NET Web Api(REST):使用用户凭据或令牌进行身份验证?将“注册新用户”资源保持无密码状态?

11
我正在尝试使用asp.net web api创建一个REST服务,一切运作正常,但现在我遇到了关于身份验证的问题。
我有点困惑从哪里开始,以下是我一直在思考的:
我有一个REST API,由多个资源组成,每个资源都需要用户注册,那么什么是最好的方式呢?我应该在每次调用服务时将用户名和密码发送到标头中,以便我可以在服务器上使用AuthorizationFilterAttribute对其进行身份验证吗?
我至少应该加密它吧?我很想知道其他人在做什么,我知道有一个概念是创建一个令牌(我想这将是短暂的),因此用户将首先进行身份验证,然后会收到一个令牌,之后将在进一步调用服务时发送该令牌。那么当令牌过期时如何处理这个问题?
我还有一个资源用于注册新用户,实际上唯一会调用它的是我的客户端(Android、iPhone)。那么我应该将它保持不受任何身份验证方法的限制,还是放置硬编码密码或类似物,以便至少没有其他人可以注册新用户?要考虑到该服务将在互联网上公开。
我似乎找不到正确的做法,我肯定希望第一次就尽量做对,以免必须彻底重构整个服务。
1个回答

11
以下链接似乎涵盖了一些明智的DIY选项:http://codebetter.com/johnvpetersen/2012/04/02/making-your-asp-net-web-apis-secure/。 "基于公钥/私钥的令牌"部分介绍了一种我过去有效使用过的方法,可能对您有所帮助。
目前,我正在使用http://identityserver.codeplex.com/,Thinktecture IdentityServer和OAuth令牌("资源所有者密码凭据"授权类型)...我发现这是一个非常好的代码和例子集来工作,并且拥有IOS客户端获取令牌并调用WebAPI。
如果您确实需要保护注册屏幕,可以使用安装在设备上的客户端证书进行身份验证...同样,Thinktecture服务可以在这里提供帮助:https://identity.thinktecture.com/idsrv/docs/default.htm?RequestingatokenusingOAuth2.html。虽然如果您的注册流程是安全的,例如电子邮件确认和激活等电子邮件中激活/注册/重置密码链接的最佳做法,它可能是可以公开访问的 - 这完全取决于您的业务要求和所需的注册工作流程。
您至少应该使用传输水平安全SSL,但正如您建议的,消息级安全性,例如加密任何令牌非常值得推荐 - OAuth规范对此有所说明:http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html#mitigation

关于过期令牌 - 我们倾向于与我们的密码更改策略同步地使令牌过期; 尽管保持有效时间较短很重要(以最小化令牌盗窃的影响),并且需要考虑平衡您的需求。 OAuth 有“刷新令牌”的概念为什么OAuth v2有访问令牌和刷新令牌两种,在这个主题上有一些辩论和链接,但我们目前并未使用此方法,因为我们正在使用的ID服务器当前不支持此方法。

保护您的令牌的安全也是需要考虑的因素,例如我们正在使用IOS中的KeyChain,但如果可能,还请考虑移动设备管理策略,因为如果这些令牌或密码存在设备上,它们可能会被盗,可以研究越狱检测、锁定屏幕强制执行等。


谢谢Mark,我会去看看的,这给了我很多东西可以研究。感谢您所有的帮助。 - Martin

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