MCP-安全(entra)

保护 AI 工作流程:模型上下文协议服务器的 Entra ID 身份验证

介绍

保护模型上下文协议 (MCP) 服务器的安全与锁好家门一样重要。保持 MCP 服务器开放会导致您的工具和数据遭受未经授权的访问,从而导致安全漏洞。Microsoft Entra ID 提供强大的基于云的身份和访问管理解决方案,帮助确保只有授权用户和应用程序才能与您的 MCP 服务器交互。在本节中,您将学习如何使用 Entra ID 身份验证保护您的 AI 工作流。

学习目标

读完本节后,您将能够:

  • 了解保护 MCP 服务器的重要性。
  • 解释 Microsoft Entra ID 和 OAuth 2.0 身份验证的基础知识。
  • 认识到公共客户和机密客户之间的区别。
  • 在本地(公共客户端)和远程(机密客户端)MCP 服务器场景中实现 Entra ID 身份验证。
  • 在开发 AI 工作流程时应用安全最佳实践。

安全性和 MCP

正如您不会不锁门一样,您也不应该将您的 MCP 服务器开放给任何人访问。保护您的 AI 工作流程对于构建强大、可靠且安全的应用程序至关重要。本章将向您介绍如何使用 Microsoft Entra ID 保护您的 MCP 服务器,确保只有授权用户和应用程序才能与您的工具和数据交互。

为什么安全对于 MCP 服务器至关重要

假设您的 MCP 服务器上有一个可以发送电子邮件或访问客户数据库的工具。不安全的服务器意味着任何人都有可能使用该工具,从而导致未经授权的数据访问、垃圾邮件或其他恶意活动。

通过实施身份验证,您可以确保对服务器的每个请求都经过验证,从而确认发出请求的用户或应用程序的身份。这是保护 AI 工作流程安全的第一步,也是最关键的一步。

Microsoft Entra ID 简介

Microsoft Entra ID是一项基于云的身份和访问管理服务。您可以将其视为应用程序的通用安全卫士。它负责处理验证用户身份(身份验证)和确定用户权限(授权)的复杂流程。

通过使用 Entra ID,您可以:

  • 为用户启用安全登录。
  • 保护 API 和服务。
  • 从中心位置管理访问策略。

对于 MCP 服务器,Entra ID 提供了一个强大且广受信赖的解决方案来管理谁可以访问您的服务器的功能。


了解魔法:Entra ID 身份验证的工作原理

Entra ID 使用OAuth 2.0等开放标准来处理身份验证。虽然细节可能很复杂,但核心概念很简单,可以用类比来理解。

OAuth 2.0 简介:Valet Key

可以将 OAuth 2.0 想象成您的汽车代客泊车服务。当您到达餐厅时,您无需将主钥匙交给代客泊车员。相反,您需要提供一把权限有限的代客泊车钥匙——它可以启动汽车并锁上车门,但不能打开后备箱或杂物箱。

在这个类比中:

  • 用户
  • 您的汽车MCP 服务器,拥有宝贵的工具和数据。
  • Valet是Microsoft Entra ID
  • 停车服务员是MCP客户端(尝试访问服务器的应用程序)。
  • Valet Key是访问令牌

访问令牌是您登录后,MCP 客户端从 Entra ID 收到的安全文本字符串。客户端每次请求时都会将此令牌提交给 MCP 服务器。服务器可以验证令牌,以确保请求合法,并且客户端拥有必要的权限,而这一切都无需处理您的实际凭证(例如密码)。

身份验证流程

该过程的实际运作方式如下:

Microsoft 身份验证库 (MSAL) 简介

在深入研究代码之前,有必要介绍一下您将在示例中看到的一个关键组件:Microsoft 身份验证库 (MSAL)

MSAL 是由 Microsoft 开发的一个库,它使开发人员能够更轻松地处理身份验证。您无需编写所有复杂的代码来处理安全令牌、管理登录和刷新会话,MSAL 会处理这些繁重的工作。

强烈建议使用 MSAL 之类的库,因为:

  • 它是安全的:它实施行业标准协议和安全最佳实践,降低了代码中出现漏洞的风险。
  • 它简化了开发:它抽象了 OAuth 2.0 和 OpenID Connect 协议的复杂性,允许您仅用几行代码即可为您的应用程序添加强大的身份验证。
  • 它是维护的: Microsoft 积极维护和更新 MSAL,以应对新的安全威胁和平台变化。

MSAL 支持多种语言和应用程序框架,包括 .NET、JavaScript/TypeScript、Python、Java、Go 以及 iOS 和 Android 等移动平台。这意味着你可以在整个技术堆栈中使用相同的一致身份验证模式。

要了解有关 MSAL 的更多信息,可以查看官方MSAL 概述文档。


使用 Entra ID 保护您的 MCP 服务器:分步指南

现在,让我们逐步了解如何stdio使用 Entra ID 保护本地 MCP 服务器(通过 进行通信的服务器)。此示例使用公共客户端,适用于在用户计算机上运行的应用程序,例如桌面应用程序或本地开发服务器。

场景 1:保护本地 MCP 服务器(使用公共客户端)

在这个场景中,我们将介绍一个本地运行的 MCP 服务器,它通过 进行通信stdio,并使用 Entra ID 对用户进行身份验证,然后才允许访问其工具。该服务器将包含一个工具,用于从 Microsoft Graph API 获取用户的个人资料信息。

1. 在Entra ID中设置应用程序

在编写任何代码之前,您需要在 Microsoft Entra ID 中注册您的应用程序。这会告知 Entra ID 您的应用程序,并授予其使用身份验证服务的权限。

  1. 导航到Microsoft Entra 门户
  2. 转到应用程序注册并单击新注册
  3. 为您的应用程序命名(例如“我的本地 MCP 服务器”)。
  4. 对于支持的帐户类型,请选择仅限此组织目录中的帐户
  5. 对于此示例,您可以将重定向 URI留空。
  6. 单击“注册”

注册后,请记下应用程序(客户端)ID目录(租户)ID。您将在代码中需要用到这些信息。

2. 代码:解析

让我们看一下处理身份验证的关键代码部分。此示例的完整代码可在mcp-auth-servers GitHub 仓库的Entra ID - Local - WAM文件夹中找到。

AuthenticationService.cs

该类负责处理与Entra ID的交互。

  • CreateAsync:此方法从 MSAL(Microsoft 身份验证库)初始化PublicClientApplication。它使用您的应用程序的clientId和进行配置tenantId
  • WithBroker:这使得可以使用代理(如 Windows Web 帐户管理器),从而提供更安全、更无缝的单点登录体验。
  • AcquireTokenAsync:这是核心方法。它首先尝试以静默方式获取令牌(这意味着如果用户已经拥有有效会话,则无需再次登录)。如果无法获取静默令牌,它将提示用户以交互方式登录。
// Simplified for clarity
public static async Task<AuthenticationService> CreateAsync(ILogger<AuthenticationService> logger)
{var msalClient = PublicClientApplicationBuilder.Create(_clientId) // Your Application (client) ID.WithAuthority(AadAuthorityAudience.AzureAdMyOrg).WithTenantId(_tenantId) // Your Directory (tenant) ID.WithBroker(new BrokerOptions(BrokerOptions.OperatingSystems.Windows)).Build();// ... cache registration ...return new AuthenticationService(logger, msalClient);
}public async Task<string> AcquireTokenAsync()
{try{// Try silent authentication firstvar accounts = await _msalClient.GetAccountsAsync();var account = accounts.FirstOrDefault();AuthenticationResult? result = null;if (account != null){result = await _msalClient.AcquireTokenSilent(_scopes, account).ExecuteAsync();}else{// If no account, or silent fails, go interactiveresult = await _msalClient.AcquireTokenInteractive(_scopes).ExecuteAsync();}return result.AccessToken;}catch (Exception ex){_logger.LogError(ex, "An error occurred while acquiring the token.");throw; // Optionally rethrow the exception for higher-level handling}
}

Program.cs

这是设置 MCP 服务器并集成身份验证服务的地方。

  • AddSingleton<AuthenticationService>:这会向依赖注入容器注册AuthenticationService,因此应用程序的其他部分(如我们的工具)可以使用它。
  • GetUserDetailsFromGraph工具:此工具需要一个 实例AuthenticationService。在执行任何操作之前,它会调用authService.AcquireTokenAsync()来获取有效的访问令牌。如果身份验证成功,它会使用该令牌调用 Microsoft Graph API 并获取用户的详细信息。
// Simplified for clarity
[McpServerTool(Name = "GetUserDetailsFromGraph")]
public static async Task<string> GetUserDetailsFromGraph(AuthenticationService authService)
{try{// This will trigger the authentication flowvar accessToken = await authService.AcquireTokenAsync();// Use the token to create a GraphServiceClientvar graphClient = new GraphServiceClient(new BaseBearerTokenAuthenticationProvider(new TokenProvider(authService)));var user = await graphClient.Me.GetAsync();return System.Text.Json.JsonSerializer.Serialize(user);}catch (Exception ex){return $"Error: {ex.Message}";}
}
3. 一切如何协同工作
  1. 当 MCP 客户端尝试使用该GetUserDetailsFromGraph工具时,该工具首先调用AcquireTokenAsync
  2. AcquireTokenAsync触发 MSAL 库检查有效令牌。
  3. 如果没有找到令牌,MSAL 将通过代理提示用户使用他们的 Entra ID 帐户登录。
  4. 一旦用户登录,Entra ID 就会发出访问令牌。
  5. 该工具接收令牌并使用它来安全调用 Microsoft Graph API。
  6. 用户的详细信息返回给 MCP 客户端。

此过程可确保只有经过身份验证的用户才能使用该工具,从而有效地保护您的本地 MCP 服务器。

场景 2:保护远程 MCP 服务器(使用机密客户端)

当您的 MCP 服务器运行在远程计算机(例如云服务器)上并通过 HTTP Streaming 等协议进行通信时,安全要求会有所不同。在这种情况下,您应该使用保密客户端授权码流程。这是一种更安全的方法,因为应用程序的机密信息永远不会暴露给浏览器。

此示例使用基于 TypeScript 的 MCP 服务器,该服务器使用 Express.js 处理 HTTP 请求。

1. 在Entra ID中设置应用程序

Entra ID 中的设置与公共客户端类似,但有一个主要区别:您需要创建客户端密钥

  1. 导航到Microsoft Entra 门户
  2. 在您的应用程序注册中,转到“证书和机密”选项卡。
  3. 单击“新建客户端密钥”,为其添加描述,然后单击“添加”
  4. 重要提示:请立即复制密钥值。您将无法再次看到它。
  5. 您还需要配置重定向 URI。转到“身份验证”选项卡,点击“添加平台”,选择“Web”,然后输入应用程序的重定向 URI(例如http://localhost:3001/auth/callback)。

⚠️重要安全说明:对于生产应用程序,Microsoft 强烈建议使用无密钥身份验证方法(例如托管标识工作负载联合身份验证),而不是客户端密钥。客户端密钥存在安全风险,因为它们可能被泄露或泄露。托管标识无需在代码或配置中存储凭据,从而提供了一种更安全的方法。

有关托管标识及其实现方式的详细信息,请参阅Azure 资源托管标识概述。

2. 代码:解析

此示例使用基于会话的方法。当用户进行身份验证时,服务器会将访问令牌和刷新令牌存储在会话中,并向用户提供会话令牌。此会话令牌随后将用于后续请求。此示例的完整代码可在mcp-auth-servers GitHub 仓库的“Entra ID - Confidential”客户端文件夹中找到。

Server.ts

该文件设置 Express 服务器和 MCP 传输层。

  • requireBearerAuth:这是保护/sse和端点的中间件。它会检查请求标头/message中是否存在有效的持有者令牌。Authorization
  • EntraIdServerAuthProvider:这是一个实现该McpServerAuthorizationProvider接口的自定义类。它负责处理 OAuth 2.0 流程。
  • /auth/callback:此端点负责在用户身份验证后处理来自 Entra ID 的重定向。它将授权码交换为访问令牌和刷新令牌。
// Simplified for clarity
const app = express();
const { server } = createServer();
const provider = new EntraIdServerAuthProvider();// Protect the SSE endpoint
app.get("/sse", requireBearerAuth({provider,requiredScopes: ["User.Read"]
}), async (req, res) => {// ... connect to the transport ...
});// Protect the message endpoint
app.post("/message", requireBearerAuth({provider,requiredScopes: ["User.Read"]
}), async (req, res) => {// ... handle the message ...
});// Handle the OAuth 2.0 callback
app.get("/auth/callback", (req, res) => {provider.handleCallback(req.query.code, req.query.state).then(result => {// ... handle success or failure ...});
});

Tools.ts

该文件定义了 MCP 服务器提供的工具。该getUserDetails工具与上例中的工具类似,但它从会话中获取访问令牌。

// Simplified for clarity
server.setRequestHandler(CallToolRequestSchema, async (request) => {const { name } = request.params;const context = request.params?.context as { token?: string } | undefined;const sessionToken = context?.token;if (name === ToolName.GET_USER_DETAILS) {if (!sessionToken) {throw new AuthenticationError("Authentication token is missing or invalid. Ensure the token is provided in the request context.");}// Get the Entra ID token from the session storeconst tokenData = tokenStore.getToken(sessionToken);const entraIdToken = tokenData.accessToken;const graphClient = Client.init({authProvider: (done) => {done(null, entraIdToken);}});const user = await graphClient.api('/me').get();// ... return user details ...}
});

auth/EntraIdServerAuthProvider.ts

此类处理以下逻辑:

  • 将用户重定向到 Entra ID 登录页面。
  • 将授权码交换为访问令牌。
  • 将令牌存储在中tokenStore
  • 当访问令牌过期时刷新它。
3. 一切如何协同工作
  1. 当用户首次尝试连接到 MCP 服务器时,requireBearerAuth中间件将发现他们没有有效会话,并将他们重定向到 Entra ID 登录页面。
  2. 用户使用其 Entra ID 帐户登录。
  3. /auth/callbackEntra ID使用授权码将用户重定向回端点。
  4. 服务器用该代码交换访问令牌和刷新令牌,存储它们,并创建发送给客户端的会话令牌。
  5. 客户端现在可以在Authorization标头中使用此会话令牌来对 MCP 服务器发出所有未来请求。
  6. 当调用该getUserDetails工具时,它使用会话令牌查找 Entra ID 访问令牌,然后使用该令牌调用 Microsoft Graph API。

此流程比公共客户端流程更复杂,但对于面向互联网的端点而言是必需的。由于远程 MCP 服务器可通过公共互联网访问,因此需要更强大的安全措施来防范未经授权的访问和潜在的攻击。

安全最佳实践

  • 始终使用 HTTPS:加密客户端和服务器之间的通信以保护令牌不被拦截。
  • 实施基于角色的访问控制 (RBAC):不仅要检查用户是否已通过身份验证,还要检查他们被授权执行哪些操作。您可以在 Entra ID 中定义角色,并在 MCP 服务器中检查这些角色。
  • 监控和审计:记录所有身份验证事件,以便您可以检测并应对可疑活动。
  • 处理速率限制和节流:Microsoft Graph 和其他 API 实施速率限制以防止滥用。在 MCP 服务器中实施指数退避和重试逻辑,以妥善处理 HTTP 429(请求过多)响应。考虑缓存频繁访问的数据以减少 API 调用。
  • 安全令牌存储: 安全地存储访问令牌和刷新令牌。对于本地应用程序,请使用系统的安全存储机制。对于服务器应用程序,请考虑使用加密存储或安全密钥管理服务,例如 Azure Key Vault。
  • 令牌过期处理:访问令牌的有效期有限。使用刷新令牌实现自动令牌刷新,无需重新身份验证即可保持无缝的用户体验。
  • 考虑使用 Azure API 管理:虽然直接在 MCP 服务器中实现安全机制可以实现更细粒度的控制,但像 Azure API 管理这样的 API 网关可以自动处理许多安全问题,包括身份验证、授权、速率限制和监控。它们在客户端和 MCP 服务器之间提供了一个集中式安全层。有关将 API 网关与 MCP 结合使用的详细信息,请参阅Azure API 管理:适用于 MCP 服务器的身份验证网关。

关键要点

  • 保护您的 MCP 服务器对于保护您的数据和工具至关重要。
  • Microsoft Entra ID 为身份验证和授权提供了强大且可扩展的解决方案。
  • 对本地应用程序使用公共客户端,对远程服务器使用机密客户端。
  • 授权码流程是Web 应用程序最安全的选择。

锻炼

  1. 想想你可能会构建一个 MCP 服务器。它是本地服务器还是远程服务器?
  2. 根据您的回答,您会使用公共客户端还是机密客户端?
  3. 您的 MCP 服务器需要什么权限才能对 Microsoft Graph 执行操作?

实践练习

练习 1:在 Entra ID 中注册应用程序

导航到 Microsoft Entra 门户。为您的 MCP 服务器注册一个新的应用程序。记录应用程序(客户端)ID 和目录(租户)ID。

练习 2:保护本地 MCP 服务器(公共客户端)

  • 按照代码示例集成 MSAL(Microsoft 身份验证库)进行用户身份验证。
  • 通过调用从 Microsoft Graph 获取用户详细信息的 MCP 工具来测试身份验证流程。

练习 3:保护远程 MCP 服务器(机密客户端)

  • 在 Entra ID 中注册一个机密客户端并创建客户端机密。
  • 配置您的 Express.js MCP 服务器以使用授权码流。
  • 测试受保护的端点并确认基于令牌的访问。

练习 4:应用安全最佳实践

  • 为您的本地或远程服务器启用 HTTPS。
  • 在服务器逻辑中实现基于角色的访问控制(RBAC)。
  • 添加令牌过期处理和安全令牌存储。

资源

  1. MSAL 概述文档
    了解 Microsoft 身份验证库 (MSAL) 如何跨平台实现安全令牌获取:
    Microsoft Learn 上的 MSAL 概述

  2. Azure-Samples/mcp-auth-servers GitHub 存储库
    演示身份验证流程的 MCP 服务器参考实现:
    GitHub 上的 Azure-Samples/mcp-auth-servers

  3. Azure 资源托管标识概述
    了解如何使用系统或用户分配的托管标识消除机密:
    Microsoft Learn 上的托管标识概述

  4. Azure API 管理:MCP 服务器的身份验证
    网关 深入了解如何使用 APIM 作为 MCP 服务器的安全 OAuth2 网关:
    Azure API 管理 MCP 服务器的身份验证网关

  5. Microsoft Graph 权限参考
    Microsoft Graph 的委派和应用程序权限的完整列表:
    Microsoft Graph 权限参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88756.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js特训专栏-实战进阶:8. Express RESTful API设计规范与实现

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 Express RESTful API设计规范与实现:构建标准化、可维护的接口服务 在前后端分离架构盛行的今天,RESTful A…

2025企业数字化转型之道

进入2025年&#xff0c;企业的数字化转型已经不再是选择题&#xff0c;而是生存和发展的关键。如何抓住技术的浪潮&#xff0c;提高效率、提升客户体验、加强创新&#xff0c;成了企业亟需解决的问题。 1.自动化&#xff1a;释放人力潜力 自动化是数字化转型的起点。通过RPA&a…

TCP 保活定时器详解:原理、配置与最佳实践

一、TCP 保活定时器基础原理 TCP 保活定时器&#xff08;TCP Keepalive Timer&#xff09;是 TCP 协议中用于检测长时间无数据传输的连接是否仍然有效的机制。它通过在连接空闲一段时间后发送探测报文&#xff0c;确认对方主机是否仍然可达&#xff0c;从而避免在对端异常断开…

浏览器工作原理27 [#]PWA:解决了web应用哪些问题

引用 《浏览器工作原理与实践》 PWA&#xff0c;全称是 Progressive Web App &#xff0c;翻译过来就是渐进式网页应用。根据字面意思&#xff0c;它就是“渐进式 Web 应用”。对于 Web 应用很好理解了&#xff0c;就是目前普通的 Web 页面&#xff0c;所以 PWA 所支持的首先是…

Leetcode百题斩-图论

再开下一个坑&#xff0c;图论专题居然以前都刷过了&#xff0c;三道Medium也没什么好说的&#xff0c;直接过 994. Rotting Oranges[Medium] 发现一个很神奇的事&#xff0c;这一题我再5年前的时候做&#xff0c;还是个Easy&#xff0c;现在已经涨到Medium了。看来随着通货膨…

将Python Tkinter程序转换为手机可运行的Web应用 - 详细教程

前言 作为一名Python开发者&#xff0c;你可能已经使用Tkinter创建了一些桌面GUI应用。但是如何让这些应用也能在手机上运行呢&#xff1f;本教程将详细介绍如何将基于Tkinter的Python程序转换为手机可访问的Web应用&#xff0c;让你的应用随时随地可用&#xff01; 一、为什…

Markdown批量转PDF工具:高效便捷的文档转换解决方案

Markdown批量转PDF工具&#xff1a;高效便捷的文档转换解决方案 前言 在日常工作和学习中&#xff0c;我们经常需要将Markdown文档转换为PDF格式&#xff0c;无论是为了分享、打印还是归档。虽然有很多在线工具可以实现这一功能&#xff0c;但当面对大量文档时&#xff0c;逐…

51c~嵌入式~PLC~欧姆龙~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/14017854 > PLC-- 欧姆龙 --专辑 一、欧姆龙PLC指令应用 欧姆龙PLC是一种功能完善的紧凑型PLC&#xff0c;能为业界领先的输送分散控制等提供高附加值机器控制&#xff1b;它还具有通过各种高级内装板进行升级的能…

机器人 URDF学习笔记

目录 URDF&#xff08;Unified Robot Description Format&#xff09; ✅ URDF 描述的内容包括&#xff1a; URDF&#xff08;Unified Robot Description Format&#xff09; 意思是&#xff1a;统一机器人描述格式。 它是一种用 XML 编写的格式&#xff0c;专门用于描述机器…

MySQL-主从复制分库分表

5 MySQL-主从复制&分库分表 5.1mysql 主从复制 5.1.1. 概述 主从复制是将主数据库的DDL和DML操作通过二进制日志&#xff08;binlog文件&#xff09;传送到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff0c;从而使得主库和从库的数据保持同步。 MySQL…

7.6.平衡二叉树(英文缩写为AVL树)

一.平衡二叉树的定义&#xff1a; 1.平衡二叉树简称平衡树(AVL树&#xff0c;该缩写来源于平衡二叉树的发明人的名字简称)&#xff1b; 2.结点的平衡因子左子树高-右子树高&#xff1b; 3.以上述图片左下角的二叉树为例&#xff0c;结点50的左子树的高度为2&#xff0c;右子树…

OpenCV CUDA模块设备层-----将指向共享内存(shared memory)的指针封装成一个 tuple函数smem_tuple()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV的cv::cudev模块中的一个用于 CUDA 编程的辅助函数&#xff0c;用于将指向共享内存&#xff08;shared memory&#xff09;的指针封装成一…

paddlepaddle在RTX40系安装注意事项

1 安装简介 1.1 安装注意事项 显卡型号&#xff1a;RTX4090 驱动版本&#xff1a;550.54.14 宿主机cuda版本&#xff1a;12.4 安装方式&#xff1a;conda 注意cuda和cudnn的搭配 最初安装是为了使用PaddleOCR&#xff0c;根据官网提示需要安装cuda和cudnn。这里最关键的就是针…

车载以太网-组播

目录 车载以太网中的组播:从原理到车载应用**一、组播的核心概念与车载网络价值****二、车载以太网组播的关键协议与机制**1. **组播IP地址管理(IGMP协议)**2. **组播数据链路层实现(MAC地址映射)****三、车载以太网组播的典型应用场景**1. **自动驾驶与传感器数据分发**2…

【雅思播客013】what do you do

【dialog】 A: Oh, look, there’s Veronica and her boyfriend.She’s always going on about him at the office. Oh, great, they saw us. They’re coming this way. B: Oh, man... C: Jessica! Arthur! Hi! I’d like you to meet my boyfriend Greg, he’s the VP. of q…

Freebsd 14.2系统下 wifi网卡硬件驱动软件配置调试大全

Freebsd 14.2系统下&#xff0c;网卡是AX200 先检查网卡sysctl net.wlan.devices sysctl net.wlan.devices 能识别出已经安装的 sysctl net.wlan.devices net.wlan.devices: iwlwifi0配置wlan0 # ifconfig wlan0 create wlandev iwlwifi0 # ifconfig wlan0 up # ifconfig …

Python打卡:Day39

知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 浙大疏锦行

使用 GcExcel .NET 将 Excel 导出为 PDF

引言 在企业级应用开发中&#xff0c;经常需要将Excel数据导出为PDF格式以便于共享和打印。GrapeCity Documents for Excel&#xff08;简称GcExcel&#xff09;作为一款高性能的.NET Excel组件&#xff0c;提供了强大的PDF导出功能。本文将详细介绍如何使用GcExcel .NET实现E…

每日算法刷题Day39 6.26:leetcode前缀和2道题,用时1h20min

8. 2055.蜡烛之间的盘子(中等,学习替换查询区间) 2055. 蜡烛之间的盘子 - 力扣&#xff08;LeetCode&#xff09; 思想 1.给你一个长桌子&#xff0c;桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s &#xff0c;它只包含字符 * 和 | &#xff0c;其中 * 表示一…

jrebel 下载,安装,激活步骤

参考地址&#xff1a; [笔记] 最新版 - JRebel 插件激活与配置教程 : 高效开发的必备指南_jrebel激活-CSDN博客https://blog.csdn.net/LuChangQiu/article/details/145547828 1、下载 2、激活地址&#xff1a; http://42.193.18.168:8088 ### 捡个便宜 - 交朋友吧 ###https://…