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

四、项目样例

五、资源链接

相关推荐
rick9771 小时前
C# 动态代理与 DispatchProxy:从原理到实战的完整指南
c#
tang_04271 小时前
【Hi.Ltd 专题】第8期:Managements 插件、单例与服务定位
经验分享·c#·hi.ltd系列
七夜zippoe2 小时前
Agent 上下文工程:Token 管理、上下文压缩与分层记忆设计
ai·agent·token·上下文压缩·分层记忆
曹牧12 小时前
C#:24小时制时间
c#
唐青枫18 小时前
别急着拆服务:C#.NET 微服务架构从边界设计到实战
c#·.net
czhc11400756631 天前
从一份运行日志还原一次生产卡死:三个信号与一场“假卡死“
c#
Jazz_z1 天前
如何用 C# 读取 Word 中的表格数据
开发语言·c#
阿松爱学习1 天前
【Unity开发】FileStream 详解及用法指南
unity·c#·unity开发
九章云极DataCanvas1 天前
让大模型少做重复计算 九章云极开源分布式KV Cache系统DingoCache
人工智能·开源·token·九章智算云