> 技术文档 > NetCoreKevin-DDD-微服务-WebApi-AI智能体、AISK集成、MCP协议服务、SignalR、Quartz 框架-15-认证与安全

NetCoreKevin-DDD-微服务-WebApi-AI智能体、AISK集成、MCP协议服务、SignalR、Quartz 框架-15-认证与安全


参考资料

https://github.com/junkai-li/NetCoreKevin

https://gitee.com/netkevin-li/NetCoreKevin

认证与安全

执行摘要

NetCoreKevin项目采用IdentityServer4作为认证和授权框架,结合JWT(JSON Web Token)实现安全的身份验证和权限控制。项目支持多种认证方式,包括用户名密码、微信小程序Code和短信验证码登录。数据保护方面,项目实现了多种加密算法(如AES、DES、MD5)来保护敏感信息。通过配置文件管理安全设置,确保系统的灵活性和可维护性。本文档详细描述了认证流程、授权机制、数据保护措施及API端点保护的示例代码,同时讨论了合规性要求和安全最佳实践。

系统架构

NetCoreKevin的认证和安全架构基于IdentityServer4框架,核心组件包括认证服务、权限管理和令牌生成与验证模块。以下是系统架构的可视化表示:

#mermaid-svg-CTlTGafMXBOUhrSC {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .error-icon{fill:#552222;}#mermaid-svg-CTlTGafMXBOUhrSC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CTlTGafMXBOUhrSC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CTlTGafMXBOUhrSC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CTlTGafMXBOUhrSC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CTlTGafMXBOUhrSC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CTlTGafMXBOUhrSC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CTlTGafMXBOUhrSC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CTlTGafMXBOUhrSC .marker.cross{stroke:#333333;}#mermaid-svg-CTlTGafMXBOUhrSC svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CTlTGafMXBOUhrSC .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .cluster-label text{fill:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .cluster-label span{color:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .label text,#mermaid-svg-CTlTGafMXBOUhrSC span{fill:#333;color:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .node rect,#mermaid-svg-CTlTGafMXBOUhrSC .node circle,#mermaid-svg-CTlTGafMXBOUhrSC .node ellipse,#mermaid-svg-CTlTGafMXBOUhrSC .node polygon,#mermaid-svg-CTlTGafMXBOUhrSC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CTlTGafMXBOUhrSC .node .label{text-align:center;}#mermaid-svg-CTlTGafMXBOUhrSC .node.clickable{cursor:pointer;}#mermaid-svg-CTlTGafMXBOUhrSC .arrowheadPath{fill:#333333;}#mermaid-svg-CTlTGafMXBOUhrSC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CTlTGafMXBOUhrSC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CTlTGafMXBOUhrSC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CTlTGafMXBOUhrSC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CTlTGafMXBOUhrSC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CTlTGafMXBOUhrSC .cluster text{fill:#333;}#mermaid-svg-CTlTGafMXBOUhrSC .cluster span{color:#333;}#mermaid-svg-CTlTGafMXBOUhrSC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CTlTGafMXBOUhrSC :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 客户端 WebApi AuthorizeController IdentityServer4认证服务 用户数据库 令牌生成与验证 权限服务 权限数据库

核心组件

  • IdentityServer4认证服务:位于AuthorizationService目录下,负责用户认证和令牌颁发。配置文件Config.cs定义了身份资源、API作用域和客户端信息。
  • AuthorizeController:位于WebApi/Controllers/AuthorizeController.cs,提供多种认证入口,如用户名密码登录、微信小程序登录和短信验证码登录。
  • 权限服务(KevinPermissionService):位于kevin.Permission/Service/KevinPermissionService.cs,负责权限的分配和验证,支持基于用户和角色的权限管理。
  • JWT令牌处理:位于Common/App/JwtToken.cskevin.Share/JwtBearer/目录下,定义了令牌的生成、解析和配置。
  • 加密模块(Crypto):位于AuthorizationService/Cs/Crypto.cs,提供AES、DES、MD5等多种加密方法,用于数据保护。

实现模式

  • 认证实现:项目使用IdentityServer4实现认证,支持多种认证方式。ResourceOwnerPasswordValidator.cs实现了基于用户名和密码的验证逻辑,并通过Claims传递用户信息。
  • 令牌管理:使用JWT作为令牌格式,配置信息存储在JwtSettings.cs中。令牌的生成和验证逻辑在JwtToken.cs中实现。
  • 权限验证:通过IdentityVerification.cs实现权限验证逻辑,支持令牌刷新和重新颁发,确保用户会话的安全性和连续性。
  • API端点保护:以下是一个示例代码,展示如何使用Authorize属性保护API端点:
[Authorize][HttpGet(\"ProtectedEndpoint\")]public IActionResult ProtectedEndpoint(){ return Ok(\"This is a protected endpoint.\");}

数据流

认证和授权的数据流如下:

#mermaid-svg-Tgrr7WtVPqDGVjgc {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .error-icon{fill:#552222;}#mermaid-svg-Tgrr7WtVPqDGVjgc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Tgrr7WtVPqDGVjgc .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Tgrr7WtVPqDGVjgc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Tgrr7WtVPqDGVjgc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Tgrr7WtVPqDGVjgc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Tgrr7WtVPqDGVjgc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Tgrr7WtVPqDGVjgc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .marker.cross{stroke:#333333;}#mermaid-svg-Tgrr7WtVPqDGVjgc svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Tgrr7WtVPqDGVjgc .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Tgrr7WtVPqDGVjgc text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Tgrr7WtVPqDGVjgc .actor-line{stroke:grey;}#mermaid-svg-Tgrr7WtVPqDGVjgc .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .sequenceNumber{fill:white;}#mermaid-svg-Tgrr7WtVPqDGVjgc #sequencenumber{fill:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .messageText{fill:#333;stroke:#333;}#mermaid-svg-Tgrr7WtVPqDGVjgc .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Tgrr7WtVPqDGVjgc .labelText,#mermaid-svg-Tgrr7WtVPqDGVjgc .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Tgrr7WtVPqDGVjgc .loopText,#mermaid-svg-Tgrr7WtVPqDGVjgc .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Tgrr7WtVPqDGVjgc .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Tgrr7WtVPqDGVjgc .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Tgrr7WtVPqDGVjgc .noteText,#mermaid-svg-Tgrr7WtVPqDGVjgc .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Tgrr7WtVPqDGVjgc .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Tgrr7WtVPqDGVjgc .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Tgrr7WtVPqDGVjgc .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Tgrr7WtVPqDGVjgc .actorPopupMenu{position:absolute;}#mermaid-svg-Tgrr7WtVPqDGVjgc .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Tgrr7WtVPqDGVjgc .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Tgrr7WtVPqDGVjgc .actor-man circle,#mermaid-svg-Tgrr7WtVPqDGVjgc line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Tgrr7WtVPqDGVjgc :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 用户 客户端 WebApi 认证服务 数据库 输入凭据 请求令牌 验证凭据 查询用户信息 返回用户信息 颁发令牌 返回令牌 携带令牌请求资源 验证令牌 验证结果 返回资源 用户 客户端 WebApi 认证服务 数据库

集成点

  • IdentityServer4集成:通过AuthorizationService目录下的配置和实现,与IdentityServer4集成,实现认证和授权。
  • 微信小程序和短信服务:通过AuthorizeController.cs中的方法,与外部服务集成,支持微信小程序Code和短信验证码登录。

性能分析

  • 令牌生成与验证:JWT令牌的生成和验证过程较快,但频繁的令牌刷新可能影响性能。建议使用缓存机制(如在ResourceOwnerPasswordValidator.cs中实现的缓存)来减少数据库查询。
  • 权限验证:权限验证逻辑应尽量简化,避免在每次请求时都查询数据库,可以通过缓存用户权限信息来提高性能。
  • 优化建议:在高并发场景下,建议使用分布式缓存(如Redis)存储令牌和权限信息,以提升系统响应速度。

故障排除指南

  • 令牌无效或过期:检查令牌是否正确传递,确保证书未过期。如果令牌过期,客户端应自动请求刷新令牌。
  • 权限验证失败:确认用户是否具有访问资源的权限,检查KevinPermissionService.cs中的权限分配逻辑是否正确。
  • 认证服务不可用:检查IdentityServer4服务是否正常运行,确保证书颁发机构配置正确。

参考文献