如何使 .NET Web Api 仅对我的应用程序私有

Posted

技术标签:

【中文标题】如何使 .NET Web Api 仅对我的应用程序私有【英文标题】:How to make a .NET Web Api private to my application only 【发布时间】:2014-11-09 00:36:09 【问题描述】:

我创建了一个新的 Web Api MVC4 项目并使用 API 控制器构建了一个 RESTful API,然后我使用常规的 MVC 控制器通过 HMTL5/KnockoutJS/JS 呈现视图。

视图通过 REST Api 与应用程序交互(baseUrl 属性指向我给定实体的正确 REST 端点):

        this.Post = function (entity) 

            return $.ajax(baseUrl, 
                type: 'post',
                data: ko.toJSON(entity),
                contentType: 'application/json',
                dataType: 'json'
            );
        ;

现在,我怎样才能做到只有我的应用才能使用(或查看)我的 RESTful API?

【问题讨论】:

身份验证和/或授权。您目前如何授权请求?用户需要登录吗?您是否管理这些用户的权限?您不能真正将其设为“您的应用程序的私有”,但您可以拒绝未经授权的请求。 【参考方案1】:

将授权属性与角色一起使用。

[Authorize(Roles = "Admin")]
public  class MyPrivateDataController :ApiController

【讨论】:

【参考方案2】:

是的,你可以!

使用消息处理程序或 OWIn 中间件检查请求 URL,如果它们来自您的域,则允许调用通过。否则,忽略它。

【讨论】:

不幸的是,这不适用于 AJAX 调用,因为请求将来自 客户端 而不是应用程序。如果只有 Web 应用程序与 Web API 通信,这将起作用,但是,您仍然希望在网络级别而不是应用程序级别控制它。你的应用程序不应该负责做防火墙的工作。【参考方案3】:

处理使应用程序私有化的最佳方法始终是在网络级别处理它。甚至不要将 Web API 暴露给外界。将它放在 DMZ 后面,并专门为面向用户的应用程序在防火墙上打一个洞。然后,没有其他东西可以触摸它。

编辑

抱歉,我没有注意到您是通过 AJAX 访问它的事实,所以我的建议在技术上是行不通的。但是,如果您只需要对少数端点进行客户端访问,那么这种方法仍然有一些优点。您可以在应用程序中设置仅将请求代理到私有 API 端点的操作,然后在面向用户的 AJAX 应用程序上调用这些操作,而不是直接调用 Web API。

但是,如果一切都需要在客户端可用,那么您必须公开 Web API。那时,身份验证是您唯一的选择,但保护客户端几乎是不可能的(您还必须存储身份验证令牌或验证客户端的方法,允许任何想要查看的人在您的代码中模拟您所做的事情)。

一般来说,如果代码是公开的(无需验证即可使用),那么您只想公开非原子端点(GET 请求和其他实际上不会对您的任何数据进行更改的东西)。一旦用户通过您的面向用户的应用程序进行了身份验证,您就可以公开原子端点,但它应该仅限于他们应该有权更改的内容。您还应该只使用他们的凭据来使用您的 Web API 进行身份验证,而不是使用您的应用程序的一些全局凭据集。这样,您可以在 Web API 级别控制他们的访问权限,并拒绝更改他们不应访问的内容的请求。任何更全球化的东西都应该只通过您的 Web 应用程序,代理到我的回答中首先描述的真正私有的 Web API。

【讨论】:

以上是关于如何使 .NET Web Api 仅对我的应用程序私有的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ASP.NET Web API Web 服务在本地网络中可用

如何使 ASP.NET Core Web API 操作异步执行?

Linux C 仅对我的程序禁止核心转储

如何在 asp.net web api 2 中自定义对我自己的一组表的身份验证?

如何使用 WebApplicationFactory 对 .NET 6 Web Api 项目进行集成测试?

如何使 ASP.NET Web API 正确响应 403 或 401?