2016-11-04 117 views
6

我想通過IP地址來限制一個站點。在以前版本的MVC我會添加類似如下的web.config中:Asp.Net核心IP安全

<security> 
    <ipSecurity allowUnlisted="false" denyAction="NotFound"> 
    <add allowed="true" ipAddress="XX.XX.XX.XX" subnetMask="255.255.255.0"/> 
    </ipSecurity> 
</security> 

但是,增加這一個AspNetCore項目會導致應用程序在啓動時失敗,出現錯誤

無法啓動過程Web服務器請求失敗,狀態碼爲500,內部服務器錯誤

很明顯,我打破了配置,因爲它在這裏不再處理。該錯誤產生HttpFailure日誌,它看起來像:

enter image description here

有什麼處理的最佳方式現在這個樣子,一些內置的或以其他方式

+1

你能找出內部服務器錯誤是什麼,並把它添加到您的文章? – mason

+3

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結果。 –

+0

@rboe啊是的,這是有道理的。所以你認爲它是一個手動添加它的情況呢?正在考慮可能是這種情況 – MartinM

回答

2

達米安博德取得了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(); 
      } 
     } 
    } 
+0

很好的答案,但我認爲博客文章鏈接是錯誤的。 – CalC

+0

@CalC謝謝。現在修好! – Ergwun