105 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						||
using System.Linq;
 | 
						||
using System.Net;
 | 
						||
using System.Net.Http;
 | 
						||
using System.Web.Http;
 | 
						||
using System.Web.Http.Controllers;
 | 
						||
using System.Web.Http.Filters;
 | 
						||
using System.Web.Security;
 | 
						||
using LDX.BaseData.Domain.IServices;
 | 
						||
using LDX.Core;
 | 
						||
using LDX.Core.Caching;
 | 
						||
using LDX.MES.Domain.IServices.FM;
 | 
						||
 | 
						||
namespace LDX.WebApi
 | 
						||
{
 | 
						||
    /// <summary>
 | 
						||
    /// 指定用于验证请求的 System.Security.Principal.IPrincipal 的Api授权筛选器。
 | 
						||
    /// </summary>
 | 
						||
    public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute, IOverrideFilter
 | 
						||
    {
 | 
						||
        /// <summary>
 | 
						||
        /// 是否需要登录
 | 
						||
        /// </summary>
 | 
						||
        public bool NeedLogin { get; set; }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 为操作授权时调用。
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="actionContext">上下文。</param>
 | 
						||
        public override void OnAuthorization(HttpActionContext actionContext)
 | 
						||
        {
 | 
						||
            base.OnAuthorization(actionContext);
 | 
						||
            //var authorization = actionContext.Request.Headers.Authorization;
 | 
						||
            //if ((authorization != null) && (authorization.Parameter != null))
 | 
						||
            //{
 | 
						||
            //    //解密用户ticket,并校验用户名密码是否匹配
 | 
						||
            //    var encryptTicket = authorization.Parameter;
 | 
						||
            //    if (ValidateTicket(encryptTicket))
 | 
						||
            //    {
 | 
						||
 | 
						||
            //        base.IsAuthorized(actionContext);
 | 
						||
            //    }
 | 
						||
            //    else
 | 
						||
            //    {
 | 
						||
            //        HandleUnauthorizedRequest(actionContext);
 | 
						||
            //    }
 | 
						||
            //}
 | 
						||
            ////如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401
 | 
						||
            //else
 | 
						||
            //{
 | 
						||
            //    var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
 | 
						||
            //    bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
 | 
						||
            //    if (isAnonymous) base.OnAuthorization(actionContext);
 | 
						||
            //    else HandleUnauthorizedRequest(actionContext);
 | 
						||
            //}
 | 
						||
        }
 | 
						||
        //校验用户名密码(正式环境中应该是数据库校验)
 | 
						||
        private bool ValidateTicket(string encryptTicket)
 | 
						||
        {
 | 
						||
            var token= FormsAuthentication.Decrypt(encryptTicket);
 | 
						||
            if(token.Expired)
 | 
						||
                throw new Exception("令牌已过期");
 | 
						||
            //解密Ticket
 | 
						||
            var strTicket = token.UserData;
 | 
						||
            //从Ticket里面获取用户名和密码
 | 
						||
            //var index = strTicket.IndexOf("&");
 | 
						||
            //var strUser = new Guid(strTicket.Substring(0, index));
 | 
						||
            //string strPwd = strTicket.Substring(index + 1);
 | 
						||
            var strArray  = strTicket.Split('&');
 | 
						||
            if (strArray.Length != 3)
 | 
						||
                throw new Exception("令牌参数数量不正确!");
 | 
						||
            var strUser = new Guid(strArray[0]);
 | 
						||
            string strPwd = strArray[1];
 | 
						||
            string type = strArray[2];
 | 
						||
            ServiceLocator locator = ServiceLocator.Instance;
 | 
						||
            var userService = locator.GetService<IFMUserService>();
 | 
						||
            //var platformService = locator.GetService<IPlatformUserService>();
 | 
						||
            if (type == "0")
 | 
						||
            {
 | 
						||
                var user = userService.Get(i => i.ID == strUser && i.PASSWORD == strPwd);
 | 
						||
                return user == null ? false : true;
 | 
						||
            }
 | 
						||
            else {
 | 
						||
				//var platformServiceInfo = platformService.Get(i => i.ID == strUser && i.PASSWORD == strPwd);
 | 
						||
				//return platformServiceInfo == null ? false : true;
 | 
						||
				return false;
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        private static bool SkipAuthorization(HttpActionContext actionContext)
 | 
						||
        {
 | 
						||
            return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any<AllowAnonymousAttribute>()
 | 
						||
                || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any<AllowAnonymousAttribute>();
 | 
						||
        }
 | 
						||
 | 
						||
        #region IOverrideFilter 成员
 | 
						||
 | 
						||
        public Type FiltersToOverride
 | 
						||
        {
 | 
						||
            get { return typeof(IAuthorizationFilter); }
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
    }
 | 
						||
} |