WebAPI的常见用例将是由MVC控制器呈现的视图,其中包含
JavaScript,然后打开您的API来访问数据.
但是假设您有一些昂贵的API操作,并且您不希望人们远程访问这些端点 – 您只希望应用程序提供的MVC视图来访问它们.你怎么去保护他们?
在这种情况下,Request.IsLocal不起作用,因为javascript正在其机器上的客户端浏览器中调用它.即使它工作,你需要挖掘来获得真正的HttpContext,以便找到这个属性 – 而且这个解决方案将不能在自我托管的WebAPI中运行.
对于需要有效IPrincipal的API端点,您可以使用[Authorize]属性来保护它们.但是,您希望您的应用程序能够访问匿名用户的API端点呢?
解决方法
如果您的MVC站点使用身份验证,则可以为Web API方法启用表单身份验证.您可以编写一个自定义[Authorize]属性,该属性将检查是否存在将从AJAX调用发送的表单验证cookie,如果存在则构造主体.
另一个可能的解决方案是使用更加REST风格的tokens
来保护您的API.这里的想法是,当用户在您的MVC网站上进行身份验证时,您可以生成并将一个令牌传递给将AJAX请求发送到Web API时将使用的视图,该API将会验证令牌及其签名的有效性.
另一方面,如果您的网站不使用身份验证,则会因为您使用JavaScript调用API方法而无法知道请求是否来自受信任的客户端,所以会变得非常复杂.