我们正在开发新的 API。 内部和外部客户端都可以访问此 API。
对于内部客户端,我们不需要任何身份验证。但对于外部客户端,需要身份验证(基于 JWT 令牌)。
所以,最终我们想要这样的伪代码:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
if (HttpContext.RemoteIP.IP != "192.168.1.1") // <== something like this
{
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = "https://Issuer.localdomain.local";
options.Audience = "TestAudience";
});
}
}
显然,
if (HttpContext.RemoteIP.IP != "192.1698.1.1")
行不起作用。但我希望它能澄清我们在这里尝试做的事情。
我认为您混淆了“身份验证”和“授权”。这是两个不同的过程。 “身份验证”是指系统确认您就是您所声称的身份。 “授权”是指系统根据您的凭据决定是否允许您访问资源。
“身份验证”过程通常不能基于 IP,因为它的结果应该是“声明”列表:用户的名称、角色、权限和其他属性。另一方面可以“授权”。您基本上可以说“来自该 IP 的每个人都被授权无需身份验证即可访问此资源”。
为此,您基本上需要设置默认授权策略(通过调用
services.AddAuthorization()
),并结合两个要求和 OR。有很多关于如何做到这一点的例子,例如ASP.NET Core 授权:组合 OR 需求
ASP.NET Core 文档有一篇关于此的文章。 基本上有3种实现方式:
您可以在此处查看(ASP.NET Core 的客户端 IP 安全列表)