Security 当请求来自防火墙内部时,ASP.NET Web API能否以不同的方式处理安全性?

Security 当请求来自防火墙内部时,ASP.NET Web API能否以不同的方式处理安全性?,security,asp.net-web-api,Security,Asp.net Web Api,一般来说,我对Web API、HTTP和安全性还不熟悉,但我只想知道这是否可行:当HTTP请求来自局域网时,控制器可以放松安全要求 我的特定应用程序对防火墙内的客户端的安全要求非常低。例如,我希望内部客户端应用程序能够发出带有[AllowAnonymous]标记的控制器操作请求,这样它们就不需要处理OAuth等,这对于我的内部使用场景来说似乎是完全过火了 但是,如果相同的控制器操作可用于公共互联网,则当然应适用严格的安全要求 是否可以根据来源对安全性进行不同的处理?或者是公开面向公众和内部API

一般来说,我对Web API、HTTP和安全性还不熟悉,但我只想知道这是否可行:当HTTP请求来自局域网时,控制器可以放松安全要求

我的特定应用程序对防火墙内的客户端的安全要求非常低。例如,我希望内部客户端应用程序能够发出带有[AllowAnonymous]标记的控制器操作请求,这样它们就不需要处理OAuth等,这对于我的内部使用场景来说似乎是完全过火了

但是,如果相同的控制器操作可用于公共互联网,则当然应适用严格的安全要求

是否可以根据来源对安全性进行不同的处理?或者是公开面向公众和内部API的标准做法?

当您在控制器或操作上使用[AllowAnonymous]属性时,您告诉ASP.NET它根本不应该检查用户的身份。对于来自互联网的用户来说,这不是你想要的

您可以从控制器中删除[Authorize]属性,并在用户通过以下方式进行身份验证时手动检查操作内部:

if (User.Identity.IsAuthenticated || IsLocalUser())
{
    // action implementation
}
您可以在中实现此检查

这仍然让您需要确定用户是本地用户还是来自internet。当然,您可以检查客户端IP地址来确定这一点

另一种选择是,如果本地用户是Active Directory域的一部分,则同时启用和承载方案身份验证。 来自intranet的用户可以使用Windows身份验证与服务进行对话,而internet用户需要携带JWT令牌。只有当来自internet的用户的客户端应用程序与本地用户的客户端应用程序不同时,这才有效。
免责声明:我从未尝试过最后一个选项。

将请求识别为来自防火墙内部的请求并不总是像调查IP地址那样简单。虽然现在这可能对您有效,但它可能会使您难以在不影响应用程序逻辑的情况下移动环境或修改环境


我建议开发一个简单的中间层应用程序,该应用程序的任务是使用足够的授权数据调用主应用程序,以便在与常规应用程序相同的上下文中处理安全性,但该中间层本身不会被授权。然后,您只需确保防火墙之外的用户无法访问此应用。

尝试为每种类型的用户定义一个角色。在您的例子中,是InternalUser&ExternalUser。您能否详细说明一下,如果环境发生变化,为什么本地IP检查可能会中断?即使我更改了网络的子网地址或计算机的地址,像这样的检查不会继续执行其工作吗?应用程序的安全性不应基于授权属性中的硬编码IP地址段。很可能以后需要更改网络,并且必须更新应用程序源代码以适应这一点,这是您或维护应用程序的其他人必须记住的另一件事。在任何情况下,本地IP地址检查的简单性都很好,但正如我所说的,这取决于您是否预见到在将来某个时候需要更改网络。我肯定错过了一些东西。如果一开始我的局域网是192.168.0.x,并且这个IsLocal检查工作正常,那么一年后我被迫将局域网更改为192.168.1.x,我将不需要重新编译任何东西;IsLocal将继续工作,因为我总是为LAN上的所有机器使用私有地址。那么我是不是遗漏了什么?就在最近,我办公室的网络需求发生了变化,所以我引入了另外两个本地网络,192.168.2.*和193.168.3.*并且不得不将一些站点迁移到其他网络。在这些情况下,或者类似的情况下,您只需记住,为了安全起见,您的代码依赖于用户的IP地址。不使用IP解决方案的另一个原因是,如果本地设备受到入侵的影响,您的应用程序也很容易受到影响。基本上,归根结底,在应用程序中打开后门的做法是不可取的。正如我之前也说过的,我打开后门。。。我想我明白你现在说的了。谢谢你的帮助