系列文章
C#底层库--万能进制转换器(自定义有序字符,支持任意进制)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130444724
C#底层库--StringExtension字符串扩展类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129520428
C#底层库--MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379
C#底层库--SQLBuilder构建类(自研ORM)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216
C#底层库--XML配置参数读写辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129175304
C#底层库--数据库类型与程序类型转换器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817610
C#底层库--文件上传辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817487
C#底层库--RegexHelper正则表达式辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/109745286
C#底层库--程序日志记录类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709
C#底层库--排序算法帮助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124495730
C#底层库--SQLite的使用(轻量、单击数据库)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123666958
C#底层库--获取文件版本和MD5值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871
C#底层库--文件操作类(文件重命名、目录移动、字节流转换)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887161
C#底层库--Excel数据读取类(可读加密表格)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126887445
C#底层库--随机数生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126888812
C#底层库--CSV和DataTable相互转换
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128804367
C#底层库--JSON使用教程_详细(序列化、反序列化、转DataTable)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805705
C#底层库--cookie使用教程
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816347
C#底层库--Session操作辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817096
C#底层库--Image图片操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128805298
C#底层库--图片增加水印辅助类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128817184
C#底层库--数据实体类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638
C#底层库--网络通信帮助类HTTP
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886697
文章目录
前言
【C#底层库】拒绝重复造轮子!本专栏致力于构建一套企业级通用组件库,将项目中高频使用的功能(如数据库访问、加密解密、HTTP通信、Office操作等)进行深度封装与单元测试,形成稳定可靠的"开发底座"。
您无需关心复杂的底层实现,只需一行调用代码,即可解决繁琐的业务支撑问题。专栏持续集成与优化,涵盖MySQL、日志、Session、文件处理等核心模块。关注我,让复杂的功能实现变得简单高效,有任何问题欢迎私信交流!

一、底层库作用
WebApiAuthorizeAttribute.cs,采用Filters过滤器,请求时获取actionContext.Request.Headers信息。
使用时,在控制器上,增加[WebApiAuthorizeAttribute]标注,实现接口鉴权
二、底层库源码
csharp
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace SMMS.Web.Filters
{
/// <summary>
/// access token授权验证
/// </summary>
public class WebApiAuthorizeAttribute : ActionFilterAttribute
{
/// <summary>
///
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
string header = string.Empty;
IEnumerable<string> tokens = new List<string>();
if (actionContext.Request.Headers.TryGetValues("Authorization", out tokens))
{
if (header != null && tokens.Any())
{
header = tokens.FirstOrDefault();
//获取客户端权限的token
var access_token = GetTokenFromHeader(header);
if (!string.IsNullOrWhiteSpace(access_token))
{
if (string.IsNullOrEmpty(access_token))
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("Request not valid,1"));
return;
}
string OAuthUrl = ConfigurationManager.AppSettings["OAuthServerUrl"].ToString();
string AppId = ConfigurationManager.AppSettings["OAuthAppId"].ToString();
string AppSecret = ConfigurationManager.AppSettings["OAuthAppSecret"].ToString();
string OAuthServerScope = "verifytoken";
string State = ConfigurationManager.AppSettings["OAuthState"].ToString();
SMMS.OAuth.ClientService service = new OAuth.ClientService(OAuthUrl);
try
{
var result = service.VerifyToken(access_token, AppId, AppSecret, OAuthServerScope, State);
if (!result.Success)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("Request not valid,2"+ access_token));
return;
}
}
catch
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("Request not valid,3"+ access_token));
return;
}
}
}
}
if (string.IsNullOrWhiteSpace(header))
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("Request not valid"));
return;
}
}
/// <summary>
/// 获取Header中 Token
/// </summary>
/// <param name="header"></param>
/// <returns></returns>
private string GetTokenFromHeader(string header)
{
if (string.IsNullOrWhiteSpace(header) || !header.StartsWith("Bear"))
{
return null;
}
string value = "";
if (header.StartsWith("Bearer"))
value = header.Substring("Bearer".Length).Trim();
else if(header.StartsWith("Bear"))
value = header.Substring("Bear".Length).Trim();
return value;
}
private void GetLanguage(HttpRequestMessage Request)
{
if (Request == null)
{
SMMS.Framework.Common.Extensions.IdentityExtension.Language = "enUS";
return;
}
IEnumerable<string> languages;
Request.Headers.TryGetValues("Language", out languages);
if (languages == null)
{
SMMS.Framework.Common.Extensions.IdentityExtension.Language = "enUS";
return;
}
SMMS.Framework.Common.Extensions.IdentityExtension.Language = languages.Count() > 0 ? languages.ElementAt(0) : "enUS";
return;
}
}
}
三、使用方法
csharp
/// <summary>
/// 表M_WeChatUserBindings,操作接口(CRUD)
/// 接口加鉴权WebApiAuthorizeAttribute
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost, Route("OperateWeChatUserBinding")]
[WebApiAuthorizeAttribute]
public IHttpActionResult OperateWeChatUserBinding([FromBody] WeChatUserBindingRequest request)
{
if (request == null || request.Binding == null)
{
return Ok(new ReturnValueModel
{
IsSuccess = false
});
}
var operationType = (request.OperationType ?? string.Empty).Trim().ToLower();
switch (operationType)
{
case "bind":
case "save":
var bindResult = _service.BindForMDM(request.UserIdOrAD, request.Binding.UnionId, request.Binding.OpenId);
return Ok(new ReturnValueModel
{
IsSuccess = bindResult,
Result = bindResult ? _service.Get(request.Binding.UnionId) : null
});
case "get":
var user = _service.Get(request.Binding.UnionId);
return Ok(new ReturnValueModel
{
IsSuccess = user != null,
Result = user
});
case "remove":
case "unbind":
_service.RemoveBinding(request.Binding.UnionId);
return Ok(new ReturnValueModel
{
IsSuccess = true
});
default:
return Ok(new ReturnValueModel
{
IsSuccess = false
});
}
}