目前我们正在建立一个网上商店作为SPA
申请。所有SKU信息均由Web Api 2
服务提供。
当然,每个访问者都可以公开访问网上商店,目前只有一个用户可以登录来管理网上商店:管理员。
对于我们使用bearer
令牌进行基本身份验证的管理员,因为互联网上的大量示例向我们展示了,但现在我们需要每个用户在他们看到任何产品之前登录。对于网上商店而言,这并不是我们想到的;-)
我们想要实现的是,我们的Web Api不适用于全世界,但仅适用于我们的SPA应用程序。每篇关于授权的博客文章或教程似乎都假设总有一个用户需要登录,在我们的例子中只有一个用户:管理员。
AllowAnonymous
属性再次向全世界提供特定的API调用,因此这也是一个死胡同。
基本上,它可以防止任何其他应用程序(网络或移动设备)从我们的Web Api中获取数据。
如果没有我们网站的匿名访问者登录,那么保护我们的Web Api的最佳和最安全的方法是什么?
现在的解决方案:尽管我对这个解决方案并不百分之百,但它现在还可以使用。我们为特定域启用了CORS,实现了OAuth Implicit流程。
答案 0 :(得分:2)
你应该看一下OAuth 2.0 client credentials flow。 OAuth中的客户端是应用程序,而不是使用该应用程序的用户。这样,您就可以确保只有您的SPA应用可以访问后端API。
只允许访问管理员的部分,您可以使用[Authorize(roles = administrator)]属性进行装饰,这可以防止任何其他角色访问。
答案 1 :(得分:1)
我认为Json Web Token可以为您提供帮助。这个article提供了有关使用Json Web Token进行web api的粒度授权的更多信息。
答案 2 :(得分:0)
OAuth 2.0本质上是不安全的,完全依赖于SSL。它没有加密,大多数最新的网络专家都暗示它已经死了。这再次与您需要的安全性相关。如果它适用于数据不具有财务或医疗功能的社交SPA,并且SSL安全性足够好,那么OpenID或OAuth2也许是合适的。
更好的解决方案是为Web API身份验证流程实现Identity 2.0,然后使用类似Hawk协议的HTTP MAC实现。请查看此内容:https://github.com/webapibook/hawknet以获取示例。
对于OAuth2框架和可扩展的解决方案,请查看GitHub上的Thinktecture.IdentityServer3
对于轻量级.net 4.5 Web API令牌化解决方案,请查看GitHub上的Thinktecture.IdentityServer2。
希望它有所帮助。