如何只从我的应用程序访问WebAPI操作?

dan*_*wig 12 security asp.net-mvc asp.net-mvc-4 asp.net-web-api

WebAPI的一个常见用例是使用MVC控制器呈现shell视图,其中包含javascript然后命中您的API以访问数据.

但是,假设您有一些昂贵的API操作,并且您不希望人们远程访问这些端点 - 您只希望应用程序提供的MVC视图访问它们.你怎么能保护他们?

在这种情况下Request.IsLocal不起作用,因为javascript是从他们的机器上的客户端浏览器调用它.即使它确实有效,你需要挖掘才能找到真正HttpContext的东西才能找到这个属性 - 而且这个解决方案在自托管的WebAPI中不起作用.

对于需要有效的API端点IPrincipal,您可以使用该[Authorize]属性保护它们.但是,您希望应用能够为匿名用户访问的API端点呢?

我已经尝试了一个解决方案并将其单独发布作为答案,因为我不确定它是否是最好的(甚至是好的)方法.

Dar*_*rov 2

如果您的 MVC 站点使用身份验证,您可以为 Web API 方法启用表单身份验证。您可以编写一个自定义[Authorize]属性来检查表单身份验证 cookie 是否存在,该 cookie 将从 AJAX 调用发送,如果存在则构造主体。

tokens另一种可能的解决方案是使用更 RESTful 的风格来保护您的 API 。这里的想法是,当用户在您的 MVC 网站上进行身份验证时,您可以生成一个令牌并将其传递到视图,该视图将在将 AJAX 请求发送到 Web API 时使用,而 Web API 反过来将验证令牌及其签名的有效性。

另一方面,如果您的网站不使用身份验证,那么事情会变得非常复杂,因为您无法知道请求是否来自受信任的客户端,因为您使用 javascript 调用 API 方法。