ASP.NET Core 中JWT的基本使用

文章目錄

  • 前言
  • 一、JWT與RBAC
  • 二、JWT 的作用
  • 三、RBAC 的核心思想
  • 四、使用
    • 1、配置文件 (appsettings.json)
    • 2、JWT配置模型 (Entity/JwtSettings.cs)
    • 3、服務擴展類,JWT配置 (Extensions/ServiceExtensions.cs)
    • 4、用戶倉庫接口服務
    • 5、認證服務 (Interface/IAuthService.cs、Repository/AuthService.cs)
    • 6、控制器(驗證登錄權限,生成Token)
    • 7、注冊服務
    • 8、使用示例
    • 9、高級權限控制
      • 1)實現自定義策略處理器:
      • 2)注冊服務及定義策略
      • 3)使用自定義策略
  • 五、關鍵安全配置
  • 六、完整流程說明
  • 總結


前言

ASP.NET Core Web API中實現基于JWTRBAC(基于角色的訪問控制)。

一、JWT與RBAC

JWT(JSON Web Token)與 RBAC(基于角色的訪問控制,Role-Based Access Access Control)結合使用時,是一種通過令牌(Token)傳遞用戶角色信息,并基于角色實現權限管理的安全機制。

二、JWT 的作用

  • JWT 是一種緊湊的、自包含的令牌格式,通常用于身份驗證和授權。其結構分為三部分:
    • Header:算法和令牌類型(如 HS256RSA)。
    • Payload:存放用戶信息(如用戶ID、角色)和聲明(如過期時間)。
    • Signature:對前兩部分的簽名,確保令牌未被篡改。

三、RBAC 的核心思想

  • RBAC 通過角色管理權限,而非直接賦予用戶權限:
    • 角色(Role):定義一組權限(如 adminuser)。
    • 權限(Permission):資源或操作(如 read:data、delete:user)。
    • 用戶被分配角色,間接獲得權限。

四、使用

1、配置文件 (appsettings.json)

  1. appsettings.json
    {"JwtSettings": {"Issuer": "yourdomain.com","Audience": "yourapp","SecretKey": "YourSuperSecretKeyAtLeast32CharactersLong","ExpirationMinutes": 60,"RefreshTokenExpirationDays": 7}"AllowedHosts": "*"
    }
    

2、JWT配置模型 (Entity/JwtSettings.cs)

  1. JwtSettings.cs
    namespace JWTWebAPI.Entity
    {public class JwtSettings{public string Issuer { get; set; } = string.Empty;public string Audience { get; set; } = string.Empty;public string SecretKey { get; set; } = string.Empty;public int ExpirationMinutes { get; set; }public int RefreshTokenExpirationDays { get; set; }}
    }
    

3、服務擴展類,JWT配置 (Extensions/ServiceExtensions.cs)

  1. ServiceExtensions.cs
    using JWTWebAPI.Entity;
    using Microsoft.AspNetCore.Authentication.JwtBearer;
    using Microsoft.IdentityModel.Tokens;
    using System.Security.Claims;
    using System.Text;namespace JWTWebAPI.Extensions
    {public static class ServiceExtensions{// JWT認證配置public static void ConfigureJwtAuthentication(this IServiceCollection services, IConfiguration configuration){var jwtSettings = configuration.GetSection("JwtSettings").Get<JwtSettings>();services.AddAuthentication(options =>{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = false,ValidIssuer = jwtSettings.Issuer,ValidateAudience = false,ValidAudience = jwtSettings.Audience,ValidateLifetime = false,ValidateIssuerSigningKey = false,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey!)), //ClockSkew = TimeSpan.Zero,RoleClaimType=ClaimTypes.Role};options.Events = new JwtBearerEvents{OnAuthenticationFailed = context =>{if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)){context.Response.Headers.Append("Token-Expired", "true");}return Task.CompletedTask;}};});}// 授權策略配置public static void ConfigureAuthorizationPolicies(this IServiceCollection services){services.AddAuthorization(options =>{// 基于角色的策略options.AddPolicy("AdminOnly", policy =>policy.RequireRole("admin"));options.AddPolicy("ManagerOnly", policy =>policy.RequireRole("admin"));// 基于自定義權限的策略options.AddPolicy("ContentEditor", policy =>policy.RequireClaim("permission", "content.edit"));options.AddPolicy("UserManagement", policy =>policy.RequireClaim("permission", "user.manage"));});}} 
    }

4、用戶倉庫接口服務

  1. Interfaces/IUserRepository.cs

    using JWTWebAPI.Entity;namespace JWTWebAPI.Interface
    {public interface IUserRepository{Task<AspNetUsers?> GetUserByCredentials(string username, string password);Task SaveRefreshToken(long userId, string refreshToken, DateTime expiry);Task<AspNetUsers?> GetUserByRefreshToken(string refreshToken);}
    }
  2. Repositories/UserRepository.cs

    using JWTWebAPI.Data;
    using JWTWebAPI.Entity;
    using JWTWebAPI.Interface;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    using Org.BouncyCastle.Crypto.Generators;namespace JWTWebAPI.Repository
    {public class UserRepositor : IUserRepository{private readonly MyDbContext _context;private readonly UserManager<AspNetUsers> _userManager;public UserRepositor(MyDbContext context, UserManager<AspNetUsers> userManager, RoleManager<Role> roleManager){_context = context;_userManager = userManager;}public async Task<AspNetUsers?> GetUserByCredentials(string username, string password){try{var user=await _userManager.FindByNameAsync(username);if (user == null) return null;return user;}catch (Exception){throw;}}public async Task<AspNetUsers?> GetUserByRefreshToken(string refreshToken){return await _context.Users.FirstOrDefaultAsync(u =>u.RefreshToken == refreshToken &&u.RefreshTokenExpiry > DateTime.UtcNow);}public async Task SaveRefreshToken(long userId, string refreshToken, DateTime expiry){var user = await _context.Users.FindAsync(userId);if (user != null){user.RefreshToken = refreshToken;user.RefreshTokenExpiry = expiry;await _context.SaveChangesAsync();}}}
    }
    

5、認證服務 (Interface/IAuthService.cs、Repository/AuthService.cs)

  1. IAuthService.cs

    using JWTWebAPI.Entity;namespace JWTWebAPI.Interface
    {public interface IAuthService{Task<AuthResult> Authenticate(string username, string password);Task<AuthResult> RefreshToken(string token, string refreshToken);}
    }
    
  2. AuthService.cs

    using JWTWebAPI.Entity;
    using JWTWebAPI.Interface;
    using Microsoft.Extensions.Options;
    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    using System.Security.Claims;
    using System.Security.Cryptography;
    using System.Text;namespace JWTWebAPI.Repository
    {public class AuthService : IAuthService{private readonly JwtSettings _jwtSettings;private readonly IUserRepository _userRepository;public AuthService(IOptions<JwtSettings> jwtSettings, IUserRepository userRepository){_jwtSettings = jwtSettings.Value;_userRepository = userRepository;}public async Task<AuthResult> Authenticate(string username, string password){var user = await _userRepository.GetUserByCredentials(username, password);if (user == null) return null;var claims = new[]{new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),new Claim(ClaimTypes.Name, user.UserName),new Claim(ClaimTypes.Role, user.Role) // 用戶角色	                };var token = GenerateJwtToken(claims);var refreshToken = GenerateRefreshToken();await _userRepository.SaveRefreshToken(user.Id, refreshToken,DateTime.UtcNow.AddDays(_jwtSettings.RefreshTokenExpirationDays));return new AuthResult{Token = token,RefreshToken = refreshToken,ExpiresIn = _jwtSettings.ExpirationMinutes * 60};}public Task<AuthResult> RefreshToken(string token, string refreshToken){throw new NotImplementedException();}private string GenerateJwtToken(IEnumerable<Claim> claims){var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var token = new JwtSecurityToken(issuer: _jwtSettings.Issuer,audience: _jwtSettings.Audience,claims: claims,expires: DateTime.UtcNow.AddMinutes(_jwtSettings.ExpirationMinutes),signingCredentials: creds);return new JwtSecurityTokenHandler().WriteToken(token);}private static string GenerateRefreshToken(){var randomNumber = new byte[32];using var rng = RandomNumberGenerator.Create();rng.GetBytes(randomNumber);return Convert.ToBase64String(randomNumber);}}
    }
  3. AuthResult.cs

    namespace JWTWebAPI.Entity
    {public class AuthResult{public string Token { get; set; }public string RefreshToken { get; set; }public int ExpiresIn { get; set; }}
    }

6、控制器(驗證登錄權限,生成Token)

  1. AuthController.cs
    using JWTWebAPI.Entity;
    using JWTWebAPI.Interface;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Identity.Data;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Options;
    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    using System.Runtime;
    using System.Security.Claims;
    using System.Text;namespace JWTWebAPI.Controllers
    {[Route("api/[controller]/[action]")][ApiController]public class AuthController : ControllerBase{private readonly IConfiguration _config;private readonly IOptionsSnapshot<JwtSettings> _settings;private readonly IAuthService _authService;public AuthController(IConfiguration config, IOptionsSnapshot<JwtSettings> settings, IAuthService authService){_config = config;_settings = settings;_authService = authService;}[HttpPost][AllowAnonymous]public async Task<IActionResult> Login([FromBody] LoginModel request){var result = await _authService.Authenticate(request.Username, request.Password);if (result == null) return Unauthorized();return Ok(result);}[HttpPost][AllowAnonymous]public async Task<IActionResult> Refresh([FromBody] RefreshTokenRequest request){var result = await _authService.RefreshToken(request.Token, request.RefreshToken);if (result == null) return Unauthorized();return Ok(result);}}
    } 
    
  2. LoginModel.cs
    namespace JWTWebAPI.Entity
    {public class LoginModel{public string Username { get; set; } = string.Empty;public string Password { get; set; } = string.Empty;}
    }
    
  3. RefreshTokenRequest.cs
    public class RefreshTokenRequest
    {[Required] public string Token { get; set; }[Required] public string RefreshToken { get; set; }
    }
    

7、注冊服務

  1. Program.cs

    using JWTWebAPI.Data;
    using JWTWebAPI.Entity;
    using JWTWebAPI.Extensions;
    using JWTWebAPI.Interface;
    using JWTWebAPI.Repository;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;var builder = WebApplication.CreateBuilder(args);
    // 添加數據庫上下文
    var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
    builder.Services.AddDbContext<MyDbContext>(opt => {opt.UseSqlServer(connectionString);
    });
    builder.Services.AddDataProtection();
    builder.Services.AddIdentityCore<AspNetUsers>(opt => {
    opt.Lockout.MaxFailedAccessAttempts = 5;//登錄失敗多少次賬號被鎖定
    opt.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(1);//鎖定多長時間
    opt.Password.RequireDigit = false;//密碼是否需要數字    
    opt.Password.RequireLowercase = false;//密碼是否需要小寫字符
    opt.Password.RequireUppercase = false;//密碼是否需要大寫字符
    opt.Password.RequireNonAlphanumeric = false;//密碼是否需要非字母數字的字符
    opt.Password.RequiredLength = 6;//密碼長度opt.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;//密碼重置令牌,使用默認的郵箱令牌提供程序來生成和驗證令牌。此提供程序通常與用戶郵箱關聯,生成的令牌會通過郵件發送給用戶,保證用戶通過郵件接收密碼重置鏈接。
    opt.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;//配置郵箱確認令牌(Email Confirmation Token)的生成和驗證所使用的提供程序(Provider)
    });
    var idBuilder = new IdentityBuilder(typeof(AspNetUsers), typeof(Role), builder.Services);idBuilder.AddEntityFrameworkStores<MyDbContext>()
    .AddDefaultTokenProviders().AddUserManager<UserManager<AspNetUsers>>()
    .AddRoleManager<RoleManager<Role>>();builder.Services.Configure<JwtSettings>(builder.Configuration.GetSection("JwtSettings"));
    // 添加JWT認證
    // 3. 認證服務配置(來自ServiceExtensions)
    builder.Services.ConfigureJwtAuthentication(builder.Configuration);  // 擴展方法ServiceExtensions.cs
    // 4. 授權策略配置(來自ServiceExtensions)
    builder.Services.ConfigureAuthorizationPolicies();  // 擴展方法ServiceExtensions.cs// 5. 注冊應用服務
    builder.Services.AddScoped<IUserRepository, UserRepositor>();
    builder.Services.AddScoped<IAuthService, AuthService>();builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    //跨域
    builder.Services.AddCors(options =>
    {options.AddPolicy("AllowAll", builder =>builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
    });var app = builder.Build();// Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {app.UseSwagger();app.UseSwaggerUI();
    }app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseCors("AllowAll");
    app.MapControllers();app.Run();

8、使用示例

  1. AdminController.cs
    在需要權限的Controller上添加特性:
    using JWTWebAPI.Entity;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;namespace JWTWebAPI.Controllers
    {[Route("api/[controller]/[action]")][ApiController]public class AdminController : ControllerBase{[HttpGet][Authorize(Roles = "admin")] // 僅Admin角色可訪問public IActionResult GetAdminData(){return Ok("Admin data");}[HttpGet][Authorize(Policy = "AdminOnly")] // 使用策略public IActionResult GetUserInfo(){return Ok("User info");}}
    }
    

9、高級權限控制

1)實現自定義策略處理器:

  1. PermissionHandler.cs

    using JWTWebAPI.Entity;
    using Microsoft.AspNetCore.Authorization;namespace JWTWebAPI.Extensions
    {public class PermissionHandler : AuthorizationHandler<PermissionRequirement>{protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){var permissions = context.User.FindFirst(c => c.Type == "permissions")?.Value.Split(',');if (permissions?.Any(p => p == requirement.Permission) == true){context.Succeed(requirement);}return Task.CompletedTask;}}
    }
    
  2. PermissionRequirement.cs

    using Microsoft.AspNetCore.Authorization;namespace JWTWebAPI.Entity
    {public class PermissionRequirement: IAuthorizationRequirement{public string Permission { get; set; }public PermissionRequirement(string permission){Permission = permission;}}
    }
    

2)注冊服務及定義策略

  1. Program.cs
    //注冊
    builder.Services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
    //定義策略(可放在擴展方法中:ServiceExtensions.cs中的ConfigureAuthorizationPolicies方法中)
    builder.Services.AddAuthorization(options =>
    {options.AddPolicy("UpdateValidate", policy =>policy.Requirements.Add(new PermissionRequirement("profile.update")));
    });
    

3)使用自定義策略

  1. AdminController.cs
    using JWTWebAPI.Entity;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;namespace JWTWebAPI.Controllers
    {[Route("api/[controller]/[action]")][ApiController]public class AdminController : ControllerBase{[HttpGet][Authorize(Policy = "UpdateValidate")]public IActionResult GetMessage(){return Ok("自定義驗證");}}
    }

五、關鍵安全配置

  • 密鑰安全
    • 生產環境不要將密鑰放在appsettings.json
    • 使用Azure Key Vault環境變量存儲密鑰
    builder.Configuration.AddEnvironmentVariables();
    
  • HTTPS重定向
    app.UseHttpsRedirection();
    
  • CORS配置
    services.AddCors(options =>
    {options.AddPolicy("ApiPolicy", builder =>{builder.WithOrigins("https://your-frontend.com").AllowAnyHeader().AllowAnyMethod().AllowCredentials();});
    });
    

六、完整流程說明

  1. 用戶通過/api/auth/login獲取JWT Token
  2. 后續請求在Header中添加Authorization: Bearer {token}
  3. 系統自動驗證Token有效性
  4. 根據Controller/Action上的授權策略進行權限驗證

總結

通過以上實現,可以構建靈活、可擴展的權限控制系統,滿足以下場景:

  • 基于資源的細粒度控制
  • 動態權限管理
  • 多條件組合授權

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82005.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(19)java在區塊鏈中的應用

&#x1f517; Java在區塊鏈中的應用&#xff1a;智能合約開發全攻略 TL;DR: Java在區塊鏈領域主要通過Hyperledger Fabric、Web3j和專用JVM實現智能合約開發&#xff0c;相比Solidity具有更強的企業級支持和開發效率&#xff0c;但在執行效率和Gas消耗方面存在差異&#xff0c…

深入理解設計模式之訪問者模式

深入理解設計模式之訪問者模式&#xff08;Visitor Pattern&#xff09; 一、什么是訪問者模式&#xff1f; 訪問者模式&#xff08;Visitor Pattern&#xff09;是一種行為型設計模式。它的主要作用是將數據結構與數據操作分離&#xff0c;使得在不改變數據結構的前提下&…

div或button一些好看實用的 CSS 樣式示例

1&#xff1a;現代漸變按鈕 .count {width: 800px;background: linear-gradient(135deg, #72EDF2 0%, #5151E5 100%);padding: 12px 24px;border-radius: 10px;box-shadow: 0 4px 15px rgba(81, 81, 229, 0.3);color: white;font-weight: bold;border: none;cursor: pointer;t…

【基于STM32的新能源汽車智能循跡系統開發全解析】

基于STM32的新能源汽車智能循跡系統開發全解析&#xff08;附完整工程代碼&#xff09; 作者聲明 作者&#xff1a; 某新能源車企資深嵌入式工程師&#xff08;專家認證&#xff09; 技術方向&#xff1a; 智能駕駛底層控制 | 車規級嵌入式開發 原創聲明&#xff1a; 本文已申…

HTML Day02

Day02 0. 引言1. 文本格式化1.1 HTML文本格式化標簽1.2 HTML"計算機輸出"標簽1.3 HTML 引文&#xff0c;引用及標簽定義 2. HTML鏈接2.1鏈接跳轉原理&#xff08;有點亂可跳過&#xff09;2.2 HTML超鏈接2.3 target屬性2.4 id屬性2.4.1 id屬性在頁面內和不同頁面的定…

MIT 6.S081 2020 Lab6 Copy-on-Write Fork for xv6 個人全流程

文章目錄 零、寫在前面一、Implement copy-on write1.1 說明1.2 實現1.2.1 延遲復制與釋放1.2.2 寫時復制 零、寫在前面 可以閱讀下 《xv6 book》 的第五章中斷和設備驅動。 問題 在 xv6 中&#xff0c;fork() 系統調用會將父進程的整個用戶空間內存復制到子進程中。**如果父…

xhr、fetch和axios

XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在瀏覽器中進行異步網絡請求的 API。它允許網頁在不刷新整個頁面的情況下與服務器交換數據。 // 創建 XHR 對象 const xhr new XMLHttpRequest();// 初始化請求 xhr.open(GET, https://api.example.com/data, true);// 設置請…

電腦驅動程序更新工具, 3DP Chip 中文綠色版,一鍵更新驅動!

介紹 3DP Chip 是一款免費的驅動程序更新工具&#xff0c;可以幫助用戶快速、方便地識別和更新計算機硬件驅動程序。 驅動程序更新工具下載 https://pan.quark.cn/s/98895d47f57c 軟件截圖 軟件特點 簡單易用&#xff1a;用戶界面簡潔明了&#xff0c;操作方便&#xff0c;…

機器學習與深度學習06-決策樹02

目錄 前文回顧5.決策樹中的熵和信息增益6.什么是基尼不純度7.決策樹與回歸問題8.隨機森林是什么 前文回顧 上一篇文章地址&#xff1a;鏈接 5.決策樹中的熵和信息增益 熵和信息增益是在決策樹中用于特征選擇的重要概念&#xff0c;它們幫助選擇最佳特征進行劃分。 熵&#…

【Kotlin】數字字符串數組集合

【Kotlin】簡介&變量&類&接口 【Kotlin】數字&字符串&數組&集合 文章目錄 Kotlin_數字&字符串&數組&集合數字字面常量顯式轉換數值類型轉換背后發生了什么 運算字符串字符串模板字符串判等修飾符數組集合通過序列提高效率惰性求值序列的操…

oscp練習PG Monster靶機復現

端口掃描 nmap -A -p- -T4 -Pn 192.168.134.180 PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.3.10) |_http-server-header: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.3.10 | http-methods:…

近期知識庫開發過程中遇到的一些問題

我們正在使用Rust開發一個知識庫系統&#xff0c;遇到了一些問題&#xff0c;在此記錄備忘。 錯誤&#xff1a;Unable to make method calls because underlying connection is closed 場景&#xff1a;在docker中調用headless_chrome時出錯 原因&#xff1a;為減小鏡像大小&am…

Ubuntu 22.04 系統下 Docker 安裝與配置全指南

Ubuntu 22.04 系統下 Docker 安裝與配置全指南 一、前言 Docker 作為現代開發中不可或缺的容器化工具&#xff0c;能極大提升應用部署和環境管理的效率。本文將詳細介紹在 Ubuntu 22.04 系統上安裝與配置 Docker 的完整流程&#xff0c;包括環境準備、安裝步驟、權限配置及鏡…

C#獲取磁盤容量:代碼實現與應用場景解析

C#獲取磁盤容量&#xff1a;代碼實現與應用場景解析 在軟件開發過程中&#xff0c;尤其是涉及文件存儲、數據備份等功能時&#xff0c;獲取磁盤容量信息是常見的需求。通過獲取磁盤的可用空間和總大小&#xff0c;程序可以更好地進行資源管理、預警提示等操作。在 C# 語言中&a…

2025年- H56-Lc164--200.島嶼數量(圖論,深搜)--Java版

1.題目描述 2.思路 &#xff08;1&#xff09;主函數&#xff0c;存儲圖結構 &#xff08;2&#xff09;主函數&#xff0c;visit數組表示已訪問過的元素 &#xff08;3&#xff09;輔助函數&#xff0c;用遞歸&#xff08;深搜&#xff09;&#xff0c;遍歷以已訪問過的元素&…

詳細到用手撕transformer下半部分

之前我們討論了如何實現 Transformer 的核心多頭注意力機制&#xff0c;那么這期我們來完整地實現整個 Transformer 的編碼器和解碼器。 Transformer 架構最初由 Vaswani 等人在 2017 年的論文《Attention Is All You Need》中提出&#xff0c;專為序列到序列&#xff08;seq2s…

WPF事件處理器+x名稱空間

目錄 ?編輯 一、事件處理器知識點 1. XAML中的事件綁定 2. C#中的事件處理方法 3. 方法簽名解釋 4. 命名規范 工作流程 二、導入引用名稱空間 三、x名稱空間及其常用元素 &#xff08;1&#xff09;x名稱空間的由來和作用 &#xff08;2&#xff09;x名稱空間里都有…

Axure設計案例——科技感漸變線性圖

想讓數據變化趨勢展示告別枯燥乏味&#xff0c;成為吸引觀眾目光的亮點嗎&#xff1f;快來看看這個Axure設計的科技感漸變線性圖案例&#xff01;科技感設計風格憑借炫酷的漸變色彩打破傳統線性圖的單調&#xff0c;營造出一種令人過目難忘的視覺體驗。每一條線條都仿佛是流動的…

Git全流程操作指南

Git全流程操作指南 一、Git 環境配置 1. 安裝 Git Windows&#xff1a;下載 Git for Windows macOS&#xff1a;brew install git Linux&#xff1a; sudo apt-get update && sudo apt-get install git # Debian/Ubuntu sudo yum install git …

AI與軟件工程結合的未來三年發展路徑分析

基于對數字化、制造業、工業、零售業等行業的系統調研&#xff0c;以及微軟、谷歌、阿里、華為等大廠的實踐案例&#xff0c;我們可以預見未來三年AI與軟件工程結合將呈現以下發展路徑和趨勢。 一、技術應用維度 1. AI輔助編程工具全面普及 未來三年&#xff0c;AI輔助編程工…