桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载导读Electron.NET 默认会在 .NET 与 Node.jsElectron 主进程之间的 IPC 通道上启用启动期安全机制使同一台机器上不同用户账号运行的多个实例可以安全共存。但对于承载在 ASP.NET Core 之上的 Web 应用本身这种保护并不充分。本文围绕 docs/Using/Secure-Communication.md 的官方指引结合ElectronNET.AspNet源码完整讲解如何通过IElectronAuthenticationServiceElectronAuthenticationMiddleware为 ASP.NET Core 应用开启二次认证确保只有由当前 .NET 实例派生的 Electron 客户端才能访问应用。读完本文你将掌握安全通信的完整配置步骤、底层 token 协商链路以及中间件的实际请求校验流程。默认的 IPC 安全机制它能保护什么Electron.NET 的架构中.NET 进程与 ElectronNode.js进程之间通过 Socket.IO 桥接通信对应 SocketBridgeService。在启动阶段两者会协商出一个认证令牌auth token后续每一次桥接调用都要携带该令牌。从源码可以还原这条默认保护链路的完整形态令牌生成与传递Electron 主进程被 .NET 进程拉起后通过标准输出回传端口、主机与令牌见 ElectronProcessActive.cs并被写入 ElectronNetRuntime.ElectronAuthToken。命令行参数令牌也可以作为electronAuthToken参数传给 .NET 侧由 StartupManager.cs 解析并写入ElectronNetRuntime.ElectronAuthToken对应的参数常量定义在 ElectronNetRuntime.cs。桥接校验两种启动模式下.NET 先启动 / Electron 先启动运行时控制器都会取出该令牌创建带认证的SocketBridgeService见 RuntimeControllerDotNetFirst.cs 与 RuntimeControllerElectronFirst.cs。由此默认安全意味着IPC 桥接层面上不同用户账号在同一台机器上运行的多个 Electron.NET 实例互不可见、互不干扰。但正如官方文档明确指出这不足以保护背后的 Web 应用也不足以对抗恶意的 root 用户。因为ASP.NET Core 承载的 Web 服务监听在 localhost 端口上任何能访问该端口的本机进程都可能直接发起 HTTP 请求root 用户拥有系统的最高权限可以读取进程参数、内存甚至直接伪造请求单纯依赖进程级隔离无法防护。为 Web 应用开启认证两步 opt-in 配置官方给出的方案是复用 IPC 桥接已经协商好的认证令牌让 ASP.NET Core 应用也能验证发起请求的客户端是否正是当前实例派生的 Electron 进程。你只需完成两个动作。第一步在AddElectron之前注册认证服务文档强调关键点在于必须在调用AddElectron之前将认证服务注册到服务容器。这是因为 Electron.NET 在运行时解析IElectronAuthenticationService如果发现它已被注册就会在启动阶段把协商好的令牌写入该服务供后续请求校验使用。using ElectronNET.AspNet.Middleware; using ElectronNET.AspNet.Services; var builder WebApplication.CreateBuilder(args); // 必须在 AddElectron 之前注册 builder.Services.AddSingletonIElectronAuthenticationService, ElectronAuthenticationService(); builder.Services.AddElectron();注册之后Electron.NET 就知道你希望存储并复用 .NET 与 Node.js 在启动时协商出的认证令牌。这一点可以从 RuntimeControllerAspNetBase.cs 得到印证当 Electron 进程就绪且 AspNet 生命周期适配器就绪时运行时会取出ElectronNetRuntime.ElectronAuthToken并通过this.authenticationService?.SetExpectedToken(token)写入认证服务注释明确写道Only if somebody registered an IElectronAuthenticationService service - otherwise we do not care即只有注册了该服务才会执行。第二步注册认证中间件接下来注册中间件对来源非本 Electron.NET 应用的请求直接拒绝var app builder.Build(); // 必须放在所有路由之前 app.UseMiddlewareElectronAuthenticationMiddleware(); app.UseRouting();官方文档特别强调必须置于任何路由之上例如在UseRouting之前否则中间件不会对所有请求生效部分端点可能绕过认证。源码级原理剖析令牌如何存储与校验认证服务常量时间比较防时序攻击ElectronAuthenticationService 是IElectronAuthenticationService的默认实现内部维护一个_expectedToken字段通过lock保证多线程读写安全并提供两个核心方法SetExpectedToken(string token)由运行时在启动阶段调用写入期望令牌ValidateToken(string token)校验传入令牌先做空值检查再做常量时间比较ConstantTimeEquals按位异或累加防止通过响应时间差异进行时序攻击timing attack。private static bool ConstantTimeEquals(string a, string b) { if (a null || b null || a.Length ! b.Length) return false; var result 0; for (int i 0; i a.Length; i) { result | a[i] ^ b[i]; } return result 0; }接口定义见 IElectronAuthenticationService.cs注释同样明确了其用途ensure only the Electron process spawned by this .NET instance can connect确保只有本 .NET 实例派生的 Electron 进程能够连接。认证中间件cookie 查询参数双通道校验ElectronAuthenticationMiddleware 实现了完整的请求校验逻辑其安全模型为首次请求Electron 主进程加载本地 URL 时会把令牌作为查询参数附加?tokenguid校验通过后中间件把令牌写入HttpOnlyCookie后续请求不再出现在 URL 中后续请求凭 Cookie 完成认证。具体判定流程对应InvokeAsync已带 Cookie取出名为ElectronAuth的 Cookie 交给ValidateToken校验有效则放行无效则返回401 Unauthorized: Invalid authentication未带 Cookie 但带 token 查询参数校验通过后写入 CookieHttpOnly true防 XSS 读取、SameSite SameSiteMode.Strict防 CSRF、Path /全局生效、Secure false因 localhost 走 HTTP、IsEssential true标记为必需 Cookie然后放行校验失败返回 401两者皆无记录告警日志并返回401 Unauthorized: Authentication required。context.Response.Cookies.Append(AuthCookieName, token, new CookieOptions { HttpOnly true, // 防止 JavaScript 访问XSS 防护 SameSite SameSiteMode.Strict, // CSRF 防护 Path /, // 对所有路由有效 Secure false, // localhost 为 HTTP故置 false IsEssential true // 应用正常运行所必需 });令牌如何到达浏览器Host 侧自动附加.NET 侧完成令牌校验配置后Electron 主进程侧ElectronNET.Host会在创建窗口加载本地 URL 时自动把令牌附加到查询参数中见 browserWindows.ts当loadUrl存在且global[authToken]可用时会判断目标是否为 localhost/127.0.0.1/::1若是则通过url.searchParams.set(token, token)注入令牌。这一设计保证了第一次请求由 Electron 自己发起时必然携带合法令牌从而让中间件能够完成首访握手。完整可运行示例Blazor SignalR 模式仓库内置了专门演示该特性的示例项目 ElectronNET.Samples.AuthMiddleware其 Program.cs 给出了完整接线顺序可作为直接参照using ElectronNET.API; using ElectronNET.API.Entities; using ElectronNET.AspNet.Middleware; using ElectronNET.AspNet.Services; var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); // CORSSignalR 需要 builder.Services.AddCors(options { options.AddPolicy(ElectronPolicy, policy { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); // 1) 先注册认证服务单例 builder.Services.AddSingletonIElectronAuthenticationService, ElectronAuthenticationService(); // 2) 再启用 Electron builder.Services.AddElectron(); builder.WebHost.UseElectron(args, async () { var options new BrowserWindowOptions { Show false, Width 1200, Height 800, IsRunningBlazor true, }; if (OperatingSystem.IsWindows() || OperatingSystem.IsLinux()) options.AutoHideMenuBar true; var browserWindow await Electron.WindowManager.CreateWindowAsync(options); browserWindow.OnReadyToShow () browserWindow.Show(); }); var app builder.Build(); // 3) 中间件必须最先注册先于路由、静态文件等 app.UseMiddlewareElectronAuthenticationMiddleware(); app.UseRouting(); app.UseCors(ElectronPolicy); if (!app.Environment.IsDevelopment()) app.UseExceptionHandler(/Error, createScopeForErrors: true); app.UseStaticFiles(); app.UseStatusCodePagesWithReExecute(/not-found, createScopeForStatusCodePages: true); app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponentsElectronNET.Samples.AuthMiddleware.Components.App() .AddInteractiveServerRenderMode(); app.Run();该示例也给出了中间件顺序的最佳实践认证中间件紧跟在builder.Build()之后、UseRouting之前注册从而覆盖包括静态文件、Razor 组件端点在内的全部请求。配置要点与边界说明顺序约束服务注册AddSingletonIElectronAuthenticationService, ElectronAuthenticationService()必须出现在AddElectron()之前。只有先注册运行时才会检测到并调用SetExpectedToken注入令牌。中间件注册UseMiddlewareElectronAuthenticationMiddleware()必须位于UseRouting之前确保认证先于路由匹配执行避免端点绕过校验。覆盖范围与限制该机制面向Electron.NET 启动模式下由自身派生的 Electron 客户端令牌由本实例在启动时协商因此其他实例、浏览器直接访问 localhost 端口时缺少合法令牌会被中间件以 401 拒绝文档明确指出该方案不构成对恶意 root 用户的防护——root 可读取令牌或 Cookie属于超出应用层认证的能力边界Cookie 的Secure false是特意为 localhost HTTP 场景设置的见源码注释 False because localhost is HTTP若将应用部署到 HTTPS 环境应相应调整若要验证效果可尝试在 Electron 窗口之外用普通浏览器直接访问应用地址观察返回401而非正常页面同时服务端日志会记录Authentication failed类别的 Warning。参考阅读官方安全指南原文docs/Using/Secure-Communication.md认证服务实现ElectronAuthenticationService.cs认证服务接口IElectronAuthenticationService.cs认证中间件实现ElectronAuthenticationMiddleware.cs完整示例项目ElectronNET.Samples.AuthMiddleware令牌协商与运行时存储ElectronNetRuntime.cs 与 StartupManager.csElectron 侧令牌注入逻辑browserWindows.ts赞分享桌面应用跨平台【免费下载链接】Electron.NET:electron: Build cross platform desktop apps with ASP.NET Core (Razor Pages, MVC, Blazor).项目地址https://gitcode.com/gh_mirrors/el/Electron.NET点击查看免费下载相关推荐如何掌握Rust宏开发gh_mirrors/ca/case-studies完全指南如何掌握Rust宏开发gh_mirrors/ca/case studies完全指南 Rust宏是元编程的强大工具能够在编译时生成代码帮助开发者编写更简洁、桌面应用跨平台Electron.NET AutoUpdater 实战指南为 ASP.NET Core 桌面应用实现全平台自动更新Electron.NET AutoUpdater 实战指南为 ASP.NET Core 桌面应用实现全平台自动更新 本篇指南完整讲解 Electron.NET桌面应用跨平台终极指南如何在ASP.NET Core中使用JWT实现安全认证授权终极指南如何在ASP.NET Core中使用JWT实现安全认证授权 在当今Web应用开发中确保API安全是至关重要的一环。ASP.NET Core作为微软推文档教程知识库示例工程上一篇CANN/ge创建Hcom等待任务API下一篇Livewire 组件事件监听全解析[On] 属性从入门到源码级原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?