چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید.

آپدیت روزانه

بیش از 500 پست آموزشی

نیازهای روز

اعمال محدودیت دسترسی به اکشن یا کنترلر در ASP.Net MVC

در یک پروژه ASP.Net MVC نیاز به عدم دسترسی به یک Action یا اعمال بر روی کلیه توابع موجود در Controller با استفاده از اعتبار سنجی آدرس IP درخواستی است، برای مثال نیاز به اعمال دسترسی کارکنان شرکت به کنترل‌پنل سامانه فقط با رنج آی‌پی خاص که برای شرکت در نظر گرفته شده است دسترسی یافت.

جهت پیاده سازی این سناریو راه‌های متفاوتی وجود دارد از جمله استفاده از Internet Information Services (IIS) Manager که این قابلیت در آن تعبیه گردیده اما محدودیت‌های که برای این راه حل وجود دارد پیکربندی IIS در زمان راه اندازی سامانه خواهد بود اما در این پست قصد داریم با استفاده از یک Action Filter این سناریو را پیاده سازی نمایم.

پوشه جدید با نام Filters تعریف و کلاس جدید با نام AuthorizeIPAddress.cs در این پوشه ایجاد نماید، در بدنه این کلاس منطق Custom Action Filter پیاده سازی خواهد شد.

using System;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplicationSample.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 (ipAddress == null || !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;
        }
    }
}

در متد IsIpAddressValid از طریق فایل Config لیست IPهای معتبر دریافت شده و در صورتی که مقدار آرگومان دریافتی در لیست آی‌پی‌های معتبر یافت نشود خروجی متد مقدار false خواهد بود:

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

جهت اعمال دسترسی کافیست بر روی Action مورد نظر اتربیوت AuthorizeIpAddress به صورت زیر تعریف شود:

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

در صورت نیاز اعمال دسترسی بر روی کلیه توابع موجود در کنترلر، AuthorizeIpAddress را بر روی کنترلر تعریف کنید:

[AuthorizeIPAddress] 
public class AdministratorController : BaseController 
{ 
    ... 
}

در صورتی که اعتبارسنجی با موفقیت صورت نگیرد با خطا HTTP Error 403.0 - Forbidden همانند تصویر زیر مواجه خواهید شد:

توجه داشته باشید در پروژه‌های واقعی می‌توان بجای استفاده از فایل Config از یک فایل XML یا پایگاه داده جهت دریافت لیست IPهای معتبر استفاده نمود.


...

امید نصری