Пример #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="code"></param>
 /// <param name="t"></param>
 /// <param name="count"></param>
 public ResponseModel(ErrorCode code, T t, long count = 0)
 {
     if (t is string)
     {
         string str = t.ToString();
         if ((str.Contains("{") && str.Contains("}")) || (str.Contains("[") && str.Contains("]")))
         {
         }
         else
         {
             str = JsonSerializerHelper.Serialize(t);
         }
         Content = "{\"code\":" + (int)code + ",\"message\":\"" + code.ToString() + "\",\"result\":" + str + ",\"count\":" + count + "}";
     }
     else
     {
         Content = "{\"code\":" + (int)code + ",\"message\":\"" + code.ToString() + "\",\"result\":" + JsonSerializerHelper.Serialize(t) + ",\"count\":" + count + "}";
     }
     ContentType = "application/json";
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="filterContext"></param>
        public void OnAuthorization(AuthorizationFilterContext filterContext)
        {
            var actionDescriptor = (ControllerActionDescriptor)filterContext.ActionDescriptor;
            IEnumerable <CustomAttributeData> methodAttributes     = actionDescriptor.MethodInfo.CustomAttributes;
            IEnumerable <CustomAttributeData> controllerAttributes = actionDescriptor.ControllerTypeInfo.CustomAttributes;
            bool   isAuthorization = true;
            string permissionName  = "";

            foreach (CustomAttributeData item in controllerAttributes)
            {
                if (item.AttributeType.Name == "AllowAnonymousAttribute")
                {
                    isAuthorization = false;
                }
                if (item.AttributeType.Name == "SSOAuthorizeAttribute")
                {
                    isAuthorization = true;
                    if (item.ConstructorArguments.Count > 0)
                    {
                        permissionName = item.ConstructorArguments[0].Value.ToString();
                    }
                }
            }
            foreach (CustomAttributeData item in methodAttributes)
            {
                if (item.AttributeType.Name == "AllowAnonymousAttribute")
                {
                    isAuthorization = false;
                }
                if (item.AttributeType.Name == "SSOAuthorizeAttribute")
                {
                    isAuthorization = true;
                    if (item.ConstructorArguments.Count > 0)
                    {
                        permissionName = item.ConstructorArguments[0].Value.ToString();
                    }
                }
            }
            if (!isAuthorization)
            {
                return;
            }
            //验证配置文件
            if (!VerifyConfig(filterContext))
            {
                return;
            }
            HttpRequest request     = filterContext.HttpContext.Request;
            var         ssourl      = request.Query["ssourls"];
            var         absoluteUrl = AppSettings.GetAbsoluteUri(request);

            if (!string.IsNullOrEmpty(ssourl)) //sso 退出
            {
                var returnUrl = request.Query["returnUrl"];
                ////////清除本站cookie
                List <string> ssoUrls = JsonSerializerHelper.Deserialize <List <string> >(Encoding.UTF8.GetString(Convert.FromBase64String(Base64SecureURL.Decode(ssourl))));
                var           cookie  = request.Cookies[CookieKey];
                if (cookie != null)
                {
                    filterContext.HttpContext.Response.Cookies.Delete(CookieKey);
                }
                /////////////////////
                for (var i = 0; i < ssoUrls.Count; i++)
                {
                    if (absoluteUrl.Contains(ssoUrls[i]))
                    {
                        ssoUrls.RemoveAt(i);
                        break;
                    }
                }
                if (ssoUrls.Count > 0)
                {
                    string newSsoUrls = JsonSerializerHelper.Serialize(ssoUrls);
                    filterContext.Result = new RedirectResult(ssoUrls[0] + "?ssourls=" + newSsoUrls.StrToBase64() + "&returnUrl=" + returnUrl);
                }
                else //最后一个
                {
                    filterContext.Result = new RedirectResult(BaseUrl + "?returnUrl=" + returnUrl);
                }
                return;
            }
            string authorization = JwtManager.GetAuthorization(request, CookieKey);
            string ticket        = request.Query["ticket"];

            if (string.IsNullOrEmpty(authorization))
            {
                if (string.IsNullOrEmpty(ticket))
                {
                    filterContext.Result = GetActionResult(absoluteUrl);
                    return;
                }
                else
                {
                    string from = AppSettings.GetApplicationUrl(request).ReplaceHttpPrefix().TrimEnd('/');
                    authorization = GetTokenByTicket(from, ticket, request.HttpContext.Connection.RemoteIpAddress.ToString());
                    if (!string.IsNullOrEmpty(authorization))
                    {
                        if (CookieTime != "session")
                        {
                            filterContext.HttpContext.Response.Cookies.Append(CookieKey, authorization, new CookieOptions()
                            {
                                Expires = DateTime.Now.AddMinutes(Convert.ToInt32(CookieTime))
                            });
                        }
                        else
                        {
                            filterContext.HttpContext.Response.Cookies.Append(CookieKey, authorization);
                        }
                    }
                    else
                    {
                        filterContext.Result = GetActionResult(absoluteUrl);
                        return;
                    }
                }
            }
            try
            {
                var principal = JwtManager.ParseAuthorization(authorization, SecretKey, filterContext.HttpContext);
                filterContext.HttpContext.User = principal;
                if (!CheckPermission(permissionName, authorization))
                {
                    filterContext.Result = new ResponseModel <string>(ErrorCode.error_permission, "");
                }
            }
            catch (Exception ex) //token失效
            {
                Log4Net.ErrorLog(ex);
                var httpCookie = filterContext.HttpContext.Request.Cookies[CookieKey];
                if (httpCookie != null)
                {
                    filterContext.HttpContext.Response.Cookies.Delete(CookieKey);
                }
                filterContext.Result = GetActionResult(absoluteUrl);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var actionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor;
            IEnumerable <CustomAttributeData> methodAttributes     = actionDescriptor.MethodInfo.CustomAttributes;
            IEnumerable <CustomAttributeData> controllerAttributes = actionDescriptor.ControllerTypeInfo.CustomAttributes;
            //是否记录日志标记
            bool isLog = true;

            foreach (CustomAttributeData item in controllerAttributes)
            {
                if (item.AttributeType.Name == "NoneLogRecordAttribute")
                {
                    isLog = false;
                }
                if (item.AttributeType.Name == "LogRecordAttribute")
                {
                    isLog = true;
                }
            }
            foreach (CustomAttributeData c in methodAttributes)
            {
                if (c.AttributeType.Name == "NoneLogRecordAttribute")
                {
                    isLog = false;
                }
                if (c.AttributeType.Name == "LogRecordAttribute")
                {
                    isLog = true;
                }
            }
            if (!isLog)
            {
                return;
            }
            MessageCenterService messageService = new MessageCenterService(BaseUrl);
            HttpRequest          request        = context.HttpContext.Request;
            //日志调用api
            var to = AppSettings.GetApplicationUrl(request).ReplaceHttpPrefix().TrimEnd('/').ToLower();
            //不使用路由中的字符串因为用户可能输入大小写,不利于统计
            var controller = actionDescriptor.ControllerName;
            var action     = actionDescriptor.ActionName;
            //路由,解决 home/index/1 后面的1无法记录
            var route = "";

            foreach (var item in context.RouteData.Values)
            {
                var value = item.Value.ToString().ToLower();
                if (value == controller.ToLower() || value == action.ToLower())
                {
                    continue;
                }
                route += item.Key + "=" + item.Value.ToString() + "&";
            }
            route = route.TrimEnd('&');
            var querystring = "*";

            if (RecordQuerystring)
            {
                querystring = request.QueryString.Value;
            }
            var requestContent = "*";

            if (RecordRequestContent)
            {
                var hasForm = request.HasFormContentType;
                if (hasForm && request.Form.Files.Count > 0)
                {
                    List <string> fileNames = new List <string>();
                    for (var i = 0; i < request.Form.Files.Count; i++)
                    {
                        fileNames.Add(request.Form.Files[i].FileName);
                    }
                    requestContent = string.Join(",", fileNames);
                }
                else
                {
                    request.Body.Seek(0, SeekOrigin.Begin);
                    var reader = new StreamReader(request.Body);
                    requestContent = reader.ReadToEndAsync().Result.Replace("\n", "").Replace("\t", "").Replace("\r", "");
                    request.Body.Seek(0, SeekOrigin.Begin);
                }
            }
            var responseContent = "*";

            if (RecordResponseContent)
            {
                var result = context.Result;
                if (result is JsonResult)
                {
                    responseContent = JsonSerializerHelper.Serialize(((JsonResult)result).Value);
                }
                if (result is ViewResult)
                {
                    responseContent = "ViewResult";
                }
                if (result is ContentResult)
                {
                    responseContent = ((ContentResult)result).Content;
                }
                if (result is StatusCodeResult)
                {
                    responseContent = ((StatusCodeResult)result).StatusCode + "-";
                }
                if (result is FileResult)
                {
                    responseContent = ((FileResult)result).FileDownloadName;
                }
                if (result is ObjectResult)
                {
                    responseContent = JsonSerializerHelper.Serialize(((ObjectResult)result).Value);
                }
                if (result is EmptyResult)
                {
                    responseContent = "";
                }
                if (result is RedirectResult)
                {
                    responseContent = "redirect:" + ((RedirectResult)result).Url;
                }
                if (result is RedirectToRouteResult)
                {
                    responseContent = "route:" + ((RedirectToRouteResult)result).RouteName;
                }
            }
            string userId = "", userName = "", from = "";;
            string authorization = JwtManager.GetAuthorization(request, CookieKey);

            if (!authorization.IsNullOrEmpty())
            {
                ClaimsPrincipal claimsPrincipal = JwtManager.ParseAuthorization(authorization, SecretKey, request.HttpContext);
                UserData        userData        = JwtManager.ParseUserData(claimsPrincipal);
                userId   = userData.UserId;
                userName = userData.UserName;
                from     = userData.From.ReplaceHttpPrefix().TrimEnd('/').ToLower();
            }
            string userHost  = request.HttpContext.Connection.RemoteIpAddress.ToString();
            string userAgent = request.Headers["User-Agent"];
            var    time      = DateTime.UtcNow.MillisecondTimeStamp() - (long)context.HttpContext.Items["log_time_start"];
            bool   exception = context.Exception != null;

            messageService.InsertLog(from, to, controller, action, route, querystring, requestContent, responseContent, userId, userName, userHost, userAgent, time, exception);
        }