محدود کردن دسترسی از طریق IP کاربر با استفاده از فیلترها

گاهی اوقات ، در یک برنامه شما نیاز دارید که دسترسی به یک Action ِ یا Controller را از طریق IP کاربر ، محدود کنید . برای مثال ، شما محدودیتی برای پنل مدیریت سایت خود ایجاد میکنید که فقط از طریق IP شرکت شما قابل دسترسی باشد . در این مقاله به بررسی این ویژگی خواهیم پرداخت .

محدود کردن دسترسی از طریق IP کاربر با استفاده از فیلترها

برای انجام این کار راه های گوناگونی وجود دارد . IIS امکان ، اعمال محدودیت با استفاده از IP را به شما میدهد ، اما در برنامه نویسی چگونه این را پیاده سازی میکند ؟

الگوریتم (سودو - کد) :

1. IP Address کاربر را بگیرید . 
2. لیست IP Address های معتبر را بگیرید . 
3. اگر IP کاربر در لیست IP ها میباشد ، آنرا به صفحه login یا هر صفحه ای که دوست دارید ارجاع دهید و در صورت معتبر نبودن و عدم وجود در لیست نیز کاربر را به یک صفحه هدایت کنید . 

کار با Context of ASP.Net MVC ، قرار دادن این منطق در یک Action Filter سفارشی ، این ویژگی را در سرتاسر برنامه برای ما فراهم خواهد آورد ، و این ویژگی در تمامی Controller ها در دسترس ما خواهد بود .

فرض کنید که در حال کار کردن با یک برنامه MVC هستید ، یک کلاس جدید اضافه کنید که منطق Action filter ما در آن پیاده سازی میشود . ما این کلاس را در فولدری به نام Filters قرار میدهیم . برای این مثال ، ما یک کلاس با نام AuthorizeIPAddress.cs در فولدر Filters ایجاد میکنیم و کد های زیر را در آن مینویسیم :

using System; 
using System.Web; 
using System.Web.Mvc; 
using System.Configuration;
 
namespace YourMVCApplication.Filters 
{ 
    /// <summary> 
    /// Only allows authorized IP addresses access. 
    /// </summary> 
    public class AuthorizeIPAddressAttribute : ActionFilterAttribute 
    { 
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
            //Get users IP Address 
            string ipAddress = HttpContext.Current.Request.UserHostAddress;
 
            if (!IsIpAddressValid(ipAddress.Trim())) 
            { 
                //Send back a HTTP Status code of 403 Forbidden  
                filterContext.Result = new HttpStatusCodeResult(403);
            }
 
            base.OnActionExecuting(filterContext); 
        } 
         
        /// <summary> 
        /// Compares an IP address to list of valid IP addresses attempting to 
        /// find a match 
        /// </summary> 
        /// <param name="ipAddress">String representation of a valid IP Address</param> 
        /// <returns></returns> 
        public static bool IsIpAddressValid(string ipAddress) 
        { 
            //Split the users IP address into it's 4 octets (Assumes IPv4) 
            string[] incomingOctets = ipAddress.Trim().Split(new char[] { '.' });
 
            //Get the valid IP addresses from the web.config 
            string addresses = 
              Convert.ToString(ConfigurationManager.AppSettings["AuthorizeIPAddresses"]);
 
            //Store each valid IP address in a string array 
            string[] validIpAddresses = addresses.Trim().Split(new char[] { ',' });
 
            //Iterate through each valid IP address 
            foreach (var validIpAddress in validIpAddresses) 
            { 
                //Return true if valid IP address matches the users 
                if (validIpAddress.Trim() == ipAddress) 
                { 
                    return true; 
                }
 
                //Split the valid IP address into it's 4 octets 
                string[] validOctets = validIpAddress.Trim().Split(new char[] { '.' });
 
                bool matches = true;
 
                //Iterate through each octet 
                for (int index = 0; index < validOctets.Length; index++) 
                { 
                    //Skip if octet is an asterisk indicating an entire 
                    //subnet range is valid 
                    if (validOctets[index] != "*") 
                    { 
                        if (validOctets[index] != incomingOctets[index]) 
                        { 
                            matches = false; 
                            break; //Break out of loop 
                        } 
                    } 
                }
 
                if (matches) 
                { 
                    return true; 
                } 
            }
 
            //Found no matches 
            return false; 
        } 
    } 
}

و کد زیر را در Web.Config قرار دهید :

<appsettings> 
     
    <!-- IP addresses allowed to view IP Address Restricted portions of the website. 
         An asterisk indicates an entire subnet is valid. --> 
      <add value="::1, 127.0.0.1, 10.0.*.*, 79.88.44.33" key="AuthorizeIPAddresses" />
 
</appsettings>

حال شما به راحتی میتوانید از آن در Controller خود استفاده کنید :

[AuthorizeIPAddress]

مثالی از استفاده آن در Action Method را در زیر مشاهده میکنید :

[AuthorizeIPAddress] 
public ActionResult AdministratorLogin() 
{ 
    return View(); 
}

مثالی از استفاده در سطح Controller :

[AuthorizeIPAddress] 
public class AdministratorController : BaseController 
{ 
    ... 
}
دانلود نسخه ی PDF این مطلب