達米安博德取得了blog post演示如何實現中間件處理IP白名單。
他給出了全局中間件或動作過濾器的例子。
無論哪種方式,您需要將允許的IP地址添加到您的appsettings.json
,並檢查客戶端的IP地址。
客戶端IP地址可通過HttpContext
(例如context.Connection.RemoteIpAddress
)獲得。
如果你想加入白名單的IP地址範圍,那麼你可以使用NuGet包IPAddressRange,它支持多種格式,如「192.168.0.0/24」和「192.168.0.0/255.255.255.0」,包括CIDR表情和IPv6的。
這裏有一個如何做,在過濾器的例子:
appsettings.json:
{
"IPAddressWhitelistConfiguration": {
"AuthorizedIPAddresses": [
"::1", // IPv6 localhost
"127.0.0.1", // IPv4 localhost
"192.168.0.0/16", // Local network
"10.0.0.0/16", // Local network
]
}
}
IPWhiteListConfiguration.cs:
namespace My.Web.Configuration
{
using System.Collections.Generic;
public class IPWhitelistConfiguration : IIPWhitelistConfiguration
{
public IEnumerable<string> AuthorizedIPAddresses { get; set; }
}
}
Startup.cs:
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.Configure<IPWhitelistConfiguration>(
this.Configuration.GetSection("IPAddressWhitelistConfiguration"));
// ...
}
}
ClientIPAddressFilterAttribute.cs:
namespace My.Web.Filters
{
using System.Collections.Generic;
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using NetTools;
using My.Web.Configuration;
public class ClientIPAddressFilterAttribute : ActionFilterAttribute
{
private readonly IEnumerable<IPAddressRange> authorizedRanges;
public ClientIPAddressFilterAttribute(IIPWhitelistConfiguration configuration)
{
this.authorizedRanges = configuration.AuthorizedIPAddresses
.Select(item => IPAddressRange.Parse(item));
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var clientIPAddress = context.HttpContext.Connection.RemoteIpAddress;
if (!this.authorizedRanges.Any(range => range.Contains(clientIPAddress)))
{
context.Result = new UnauthorizedResult();
}
}
}
你能找出內部服務器錯誤是什麼,並把它添加到您的文章? – mason
ipSecurity是特定於IIS的,而ASP.NET Core則是關於通過Kestrel服務器提供Web請求的交叉平臺。可能有更好的方法,但通過中間件管道可以按照http://stackoverflow.com/questions/28664686/how-do-i-get-client-ip-address-in-asp中所述檢索IP地址-net-core並返回一個NotFound結果。 –
@rboe啊是的,這是有道理的。所以你認爲它是一個手動添加它的情況呢?正在考慮可能是這種情況 – MartinM