Oauth 在WebApi 2中实现安全性的最佳方法是什么?

Oauth 在WebApi 2中实现安全性的最佳方法是什么?,oauth,asp.net-web-api,Oauth,Asp.net Web Api,虽然WebAPI2提供了一个使用OAuth的内置身份验证实现,但当我读到这篇文章时,我感到困惑。使用基本身份验证不是我的选择,因为我们不想使用SSL 对于公开访问的API,您认为最好的安全实现是什么?如果不能使用SSL,就不能使用承载令牌,句号。这与在普通HTTP上使用基本身份验证完全相同。构建承载令牌的基本前提是存在传输安全性。您引用的文章是由Eran Hammer撰写的,内容是关于为什么基于消息的安全性比承载令牌+SSL更好。如果在使用SSL时有限制,则不能使用承载令牌 如今,传输安全(SS

虽然WebAPI2提供了一个使用OAuth的内置身份验证实现,但当我读到这篇文章时,我感到困惑。使用基本身份验证不是我的选择,因为我们不想使用SSL


对于公开访问的API,您认为最好的安全实现是什么?

如果不能使用SSL,就不能使用承载令牌,句号。这与在普通HTTP上使用基本身份验证完全相同。构建承载令牌的基本前提是存在传输安全性。您引用的文章是由Eran Hammer撰写的,内容是关于为什么基于消息的安全性比承载令牌+SSL更好。如果在使用SSL时有限制,则不能使用承载令牌


如今,传输安全(SSL)是绝对最低要求。如果你不能使用它,因为你不能购买证书,你需要重新考虑这个决定。如果有任何其他正当理由,请查看Eran。Thinktecture IdentityModel具有Hawk实现(作为消息处理程序和OWIN中间件)。看看它。

如果不能使用SSL,就不能使用承载令牌,句号。这与在普通HTTP上使用基本身份验证完全相同。构建承载令牌的基本前提是存在传输安全性。您引用的文章是由Eran Hammer撰写的,内容是关于为什么基于消息的安全性比承载令牌+SSL更好。如果在使用SSL时有限制,则不能使用承载令牌

如今,传输安全(SSL)是绝对最低要求。如果你不能使用它,因为你不能购买证书,你需要重新考虑这个决定。如果有任何其他正当理由,请查看Eran。Thinktecture IdentityModel具有Hawk实现(作为消息处理程序和OWIN中间件)。看看吧。

我现在该怎么办:
首先,正如Badri所说,使用SSL很重要,否则保护api就没有意义了…
现在,您可以提供一些登录操作(例如,post请求)和所有post信息。
如果此人经过身份验证,您可以使用“承载令牌”进行响应,实际上,它可以是您想要的任何令牌。令牌基本上是一个随机字符串。里面可以有数字、字母等。
使用这些令牌时,用户无需在每次请求时发送其凭据。需要注意的是,此令牌当然必须过期(例如,在一小时不活动后)。
用户现在必须在每次请求时发送此令牌。这将用于在每个后续请求中对用户进行身份验证。(当然,只要代币有效)
为了提供更好的用户体验,您还可以在用户进行身份验证时发送刷新令牌。此刷新令牌也保存在用户端,并将用于刷新令牌。这样,只要此刷新令牌有效,用户就不需要提供其凭据。这可能比普通的“身份验证令牌”要长得多,因为它很少通过安全连接发送,因此被截获的机会很小。
还有一件事需要考虑:会话劫持。如果有人能够获得令牌,他可以在用户不知情的情况下模拟用户。为了防止这种情况(某种程度上),您应该将这些令牌链接到用户的当前ip地址。如果ip地址不同,他将不得不再次登录

正如我前面提到的,您可以通过post请求安全地登录,并获得一些令牌。这些令牌必须与用户发出的每个请求一起发送。使用http协议,您只需在http头中提供令牌。在标题的授权部分或您自己的某些标题中。(按照惯例,您自己的头以X-开头,因此您可以使用例如X-My-Webapi-Auth-token)

我以后会做什么:
只要您能够控制使用api的所有应用程序,这种方法就可以完美地工作。如果您想向外部开发人员开放api,您需要采取更多的安全措施,因为您可能希望能够阻止应用程序,让他们在x请求后付款,等等
但是,当你到达这一点时,你可能想考虑为认证设置OAuthService,这是一个类似的故事,但有点复杂。如果你真的想要,我(或其他人)可以详细说明你当时可以采取的措施。

我现在要做什么:
首先,正如Badri所说,使用SSL很重要,否则保护api就没有意义了…
现在,您可以提供一些登录操作(例如,post请求)和所有post信息。
如果此人经过身份验证,您可以使用“承载令牌”进行响应,实际上,它可以是您想要的任何令牌。令牌基本上是一个随机字符串。里面可以有数字、字母等。
使用这些令牌时,用户无需在每次请求时发送其凭据。需要注意的是,此令牌当然必须过期(例如,在一小时不活动后)。
用户现在必须在每次请求时发送此令牌。这将用于在每个后续请求中对用户进行身份验证。(当然,只要代币有效)
为了提供更好的用户体验,您还可以在用户进行身份验证时发送刷新令牌。此刷新令牌也保存在用户端,并将用于刷新令牌。这样,只要此刷新令牌有效,用户就不需要提供其凭据。这可能比普通的“身份验证令牌”要长得多,因为它很少通过安全连接发送,因此被截获的机会很小。
还有一件事需要考虑:会话劫持。如果有人能够得到代币,他可以,而不需要知道