【C#底层库】access_token授权鉴权验证

系列文章

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
             });
     }
 }

四、项目样例

五、资源链接

相关推荐
玩AI的奶茶7 小时前
从零到跑通:在算家云上部署大模型的完整操作手册(实例创建 / 镜像选择 / 远程连接 / 成本控制)
人工智能·ai·gpu算力·token·算力租赁
进击的大海贼9 小时前
基于C#开发的久坐提醒工具
开发语言·c#
小羊没烦恼!11 小时前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
信马堂21 小时前
WorkBuddy 接入第三方模型 API 全流程:安装与配置实录
人工智能·大模型·token·ai算力·workbuddy
小羊没烦恼!1 天前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU1141 天前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
鑫 源2 天前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
爱吃奥利奥_wen2 天前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
liangshanbo12152 天前
面试题:AI 产品里,前端怎么降低 Token 消耗?
token