WebApi限制IP地址請求

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Http.Filters;
using System.Net.Http;
using System.Net;
using System.Collections;
using System.Text.RegularExpressions;
using System.IO;
using System.Web.UI.WebControls;
using System.Text;
using System.Web.Caching;
using System.Xml.Linq;
namespace IM.WeiXinApi.Filter
{
     public  class AuthorizeAttrbute : System.Web.Http.Filters.AuthorizationFilterAttribute
    {
         public  override  void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
             var ipaddress = GetIpaddress();  // 用戶的ip
             object obj =  null;
            obj = GetCache(ipaddress+ " api ");  // 獲取請求api的ip列表
            {
                 if (obj ==  null)
                {
                     if (!IpConfig(ipaddress))
                    {
                         // 返回401錯誤
                        actionContext.Response =  new HttpResponseMessage
                        {
                            Content =  new StringContent( " 當前ip地址 " + ipaddress +  " 無訪問權限 ",
                                Encoding.GetEncoding( " UTF-8 "),  " application/json "),
                            StatusCode = HttpStatusCode.Unauthorized
                        };
                         return;
                    }
                     else
                    {
                        SetCache(ipaddress+ " api ", 16);
                    }
                }
            }
             base.OnAuthorization(actionContext);
        }
         public  static  bool IpConfig( string ip)
        {
             string urlIndex =  " ~/Xml/roleip.xml ";
             string FileName = System.Web.HttpContext.Current.Server.MapPath(urlIndex);
            XDocument doc = XDocument.Load(FileName);
             var rel =  from p  in doc.Descendants( " item "where p.Attribute( " ip ").Value.ToLower() == ip  select p;
             return rel !=  null && rel.Count() >  0 ?  true :  false;
        }
         ///   <summary>
        
///  獲取當前應用程序指定CacheKey的Cache值
        
///   </summary>
        
///   <param name="CacheKey"></param>
        
///   <returns></returns>
         public  static  object GetCache( string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
             return objCache[CacheKey];
        }
         ///   <summary>
        
///   設置緩存
        
///   </summary>
        
///   <param name="CacheKey"></param>
        
///   <param name="objObject"></param>
        
///   <param name="expires_in"></param>
         public  static  void SetCache( string CacheKey,  object objObject,  double expires_in)
        {
            Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject,  null, DateTime.Now.AddHours(expires_in), Cache.NoSlidingExpiration);
        }
         ///   <summary>
        
///    獲取IP地址
        
///   </summary>
        
///   <returns></returns>
         public  static  string GetIpaddress()
        {
             string result = String.Empty;
            result = HttpContext.Current.Request.ServerVariables[ " HTTP_CDN_SRC_IP "];
             if ( string.IsNullOrEmpty(result))
                result = HttpContext.Current.Request.ServerVariables[ " REMOTE_ADDR "];

             if ( string.IsNullOrEmpty(result))
                result = HttpContext.Current.Request.UserHostAddress;

             if ( string.IsNullOrEmpty(result) || !IsIP(result))
                 return  " 127.0.0.1 ";

             return result;
        }
         public  static  bool IsIP( string ip)
        {
             return Regex.IsMatch(ip,  " ^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$ ");         }     } }
相關文章
相關標籤/搜索