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

دوشنبه 6 دی 1395

گاهی اوقات ، در یک برنامه شما نیاز دارید که دسترسی به یک 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 
{ 
    ... 
}

آموزش asp.net mvc

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید