public Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { var response = new HttpResponseMessage(); response.StatusCode = HttpStatusCode.OK; var responseContent = new ResponseBaseModel(); if (actionExecutedContext.Exception is LogicErrorException) { responseContent.SetResponse(ResStatusCode.LogicError, actionExecutedContext.Exception.Message); } else if (actionExecutedContext.Exception is UnAuthorizeException) { responseContent.SetResponse(ResStatusCode.UnAuthorize, actionExecutedContext.Exception.Message); } else if (actionExecutedContext.Exception is UnAuthenticateException) { responseContent.SetResponse(ResStatusCode.UnAuthenticate, actionExecutedContext.Exception.Message); } else if(actionExecutedContext.Exception is FrontInputValidateErrorException) { responseContent.SetResponse(ResStatusCode.FrontInputValidateError, actionExecutedContext.Exception.Message); } else if (actionExecutedContext.Exception is UserInputValidateErrorException) { responseContent.SetResponse(ResStatusCode.UserInputValidateError, actionExecutedContext.Exception.Message); } else { responseContent.SetResponse(ResStatusCode.InternalServerError, "服务器内部错误"); _logger.Error(JsonConvert.SerializeObject(new { uri = actionExecutedContext.Request.RequestUri, head = actionExecutedContext.Request.Headers, content = actionExecutedContext.Request.Content }), actionExecutedContext.Exception); } response.Content = new StringContent(JsonConvert.SerializeObject(responseContent)); actionExecutedContext.Response = response; actionExecutedContext.Response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); return Task.FromResult(0); }
public Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { if (!actionContext.ModelState.IsValid) { IDictionary <string, IEnumerable <string> > errors = new Dictionary <string, IEnumerable <string> >(); ResponseBaseModel responseContent = new ResponseBaseModel(); responseContent.code = ResStatusCode.UserInputValidateError; foreach (var keyModelStatePair in actionContext.ModelState) { if (keyModelStatePair.Value.Errors != null && keyModelStatePair.Value.Errors.Count > 0) { IEnumerable <string> errorMessages = keyModelStatePair.Value.Errors .Where(s => !string.IsNullOrEmpty(s.ErrorMessage)) .Select(s => s.ErrorMessage).ToList(); string key = keyModelStatePair.Key; if (keyModelStatePair.Key.Split('.').Count() > 0) { key = string.Join(".", keyModelStatePair.Key.Split('.').Skip(1)); } errors.Add(key, errorMessages); } } //暂时性先显示第一个错误 //if (errors.Count > 0) //{ // responseContent.message = errors.First().Value.First(); //} responseContent.message = Newtonsoft.Json.JsonConvert.SerializeObject(errors); actionContext.Response = new System.Net.Http.HttpResponseMessage(); actionContext.Response.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(responseContent)); actionContext.Response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); actionContext.Response.Content.Headers.ContentEncoding.Add("utf-8"); } return(Task.FromResult(0)); }
public Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { var actionAttrs = actionContext.ActionDescriptor.GetCustomAttributes <CustomAuthorizeAttribute>(); if (actionAttrs.Count > 0) { var responseBaseModel = new ResponseBaseModel(); ClaimsPrincipal principal = actionContext.RequestContext.Principal as ClaimsPrincipal; if (principal != null && principal.Identity.IsAuthenticated) { //认证成功 if (actionAttrs.Any(s => null != s.Roles && s.Roles.Count() > 0)) { //需要验证权限的情况 List <Role> needRoles = actionAttrs .Select(s => s.Roles.Select(m => new Role() { roleType = s.RoleType, roleCode = m }).ToList()) .Aggregate((result, next) => { result.AddRange(next.Where(s => !result.Exists(m => m.roleType.Equals(s.roleType) && m.roleCode.Equals(s.roleCode)))); return(result); }); //当前用户具有的权限 //var oAuthRoles = principal.Claims.Where(s => s.Type.Equals(ClaimTypes.Role)).Select(s => s.Value).ToList(); //List<Role> localRoles = identityService.TransformOAuthRoleToLocalRole(oAuthRoles); var userMail = ((ClaimsIdentity)principal.Identity).FindFirst(ClaimTypes.Email).Value; var userRepoModel = this.userRepository.GetUser(userMail); List <Role> localRoles = userRepoModel.roleList; var reqParams = actionContext.ActionArguments.Values.FirstOrDefault() as RequestBaseModel; if (needRoles.Count(s => s.roleType.Equals(RoleType.Team)).Equals(needRoles.Count()) && (null == reqParams || reqParams.teamID == 0)) { //为了可读性,因此不采用!needRoles.Exists(s=>!s.roleType.Equals(RoleType.Team)) //全部是团队的角色 responseBaseModel.SetResponse(ResStatusCode.FrontInputValidateError, "团队ID不能为空"); SetOAuthErrorResponse(actionContext, responseBaseModel); } else if (needRoles.Count(s => s.roleType.Equals(RoleType.Project)).Equals(needRoles.Count()) && (null == reqParams || reqParams.projectID == 0)) { //全部是项目的角色 responseBaseModel.SetResponse(ResStatusCode.FrontInputValidateError, "项目ID不能为空"); SetOAuthErrorResponse(actionContext, responseBaseModel); } else if (null == reqParams || (reqParams.teamID == 0 && reqParams.projectID == 0)) { //混合项目和团队的角色(一般不可能发生) responseBaseModel.SetResponse(ResStatusCode.FrontInputValidateError, "团队ID和项目ID不能同时为空"); SetOAuthErrorResponse(actionContext, responseBaseModel); } else if (!CheckAuthorize(localRoles, needRoles, reqParams)) { //无角色匹配 responseBaseModel.SetResponse(ResStatusCode.UnAuthorize, "未授权用户"); SetOAuthErrorResponse(actionContext, responseBaseModel); } } } else { //认证失败 responseBaseModel.SetResponse(ResStatusCode.UnAuthenticate, "未认证用户"); SetOAuthErrorResponse(actionContext, responseBaseModel); } #region 废弃代码 //var response = new HttpResponseMessage(); //var responseContent = new ResponseBaseModel(); //var resMsg = new List<string>(); //var reqParams = (RequestBaseModel)actionContext.ActionArguments.Values.FirstOrDefault(); //reqParams = reqParams == null ? new RequestBaseModel() : reqParams; //if (string.IsNullOrEmpty(reqParams.createUser)) //{ // resMsg.Add("创建人未填"); //} //if (string.IsNullOrEmpty(reqParams.createUserName)) //{ // resMsg.Add("创建人姓名未填"); //} //if (reqParams.createTime < 0) //{ // resMsg.Add("创建时间未填"); //} //if (string.IsNullOrEmpty(reqParams.token)) //{ // resMsg.Add("token未填"); //} //if (resMsg.Count > 0) //{ // responseContent.SetResponse(ResStatusCode.UnAuthenticate, String.Join(",", resMsg)); // response.Content = new StringContent(JsonConvert.SerializeObject(responseContent)); // actionContext.Response = response; // actionContext.Response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); //} #endregion } return(Task.FromResult(0)); }
public void SetOAuthErrorResponse(HttpActionContext actionContext, ResponseBaseModel content) { actionContext.Response = new HttpResponseMessage(); actionContext.Response.Content = new StringContent(JsonConvert.SerializeObject(content)); actionContext.Response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); }