自定义C# RD Gateway:如何让Windows RDP客户端发送GatewayAccessToken
解决Windows RDP客户端不发送gatewayaccesstoken的问题
针对你遇到的RDP客户端未发送gatewayaccesstoken的问题,可按以下步骤排查和修复:
1. 修正RD Gateway端点路径
Windows RDP客户端默认会向**/rpc/rpcproxy.dll**路径发送RD Gateway认证请求,你的自定义端点/remoteDesktopGateway不符合客户端的预期逻辑,导致认证流程未触发。修改控制器路由:
[Route("/rpc/rpcproxy.dll")] public class RemoteGatewayController : Controller { // RD Gateway认证请求为POST方法 [HttpPost] public async Task<IActionResult> AuthenticateAsync() { var request = HttpContext.Request; var response = HttpContext.Response; // 检查客户端是否已发送PAA认证请求 if (request.Headers.TryGetValue("RDG-Auth-Scheme", out var authScheme) && authScheme == "PAA") { // 尝试获取客户端发送的访问令牌 if (request.Headers.TryGetValue("RDG-Access-Token", out var accessToken)) { // 此处添加你的令牌验证逻辑 if (accessToken == "SomePlainText") { return Ok(); } } // 令牌无效或未发送,返回401并要求PAA认证 response.Headers.Append("RDG-Auth-Scheme", "PAA"); return Unauthorized(); } // 初始请求,返回401触发客户端发送PAA认证信息 response.Headers.Append("RDG-Auth-Scheme", "PAA"); return Unauthorized(); } }
2. 确保响应头和状态码正确
RDP客户端需要收到401 Unauthorized状态码,同时响应头包含RDG-Auth-Scheme: PAA,才会触发发送gatewayaccesstoken。你的原代码逻辑基本正确,但需确保方法接受POST请求(RD Gateway的认证请求均为POST)。
3. 验证.rdp文件配置
确认以下配置项无拼写错误:
gatewaycredentialssource:i:5:指定使用访问令牌作为网关凭证gatewayaccesstoken:s:SomePlainText:你的目标令牌内容gatewayhostname:s:localhost:5001:网关地址和端口需与服务运行地址完全一致
4. 配置CORS允许跨域请求
RDP客户端发送的请求可能触发跨域检查,需在服务中配置CORS规则(以Program.cs为例):
var builder = WebApplication.CreateBuilder(args); // 添加CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowRDPClient", policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); builder.Services.AddControllers(); var app = builder.Build(); app.UseCors("AllowRDPClient"); // 启用CORS app.UseAuthorization(); app.MapControllers(); app.Run("https://localhost:5001"); // 建议使用HTTPS,RDP客户端对HTTP的支持有限
5. 检查RDP客户端兼容性和组策略
- 确保使用Windows 10 1709及以上版本的RDP客户端,旧版本可能不支持PAA认证的令牌发送逻辑
- 检查本地组策略:
计算机配置 -> 管理模板 -> Windows组件 -> Remote Desktop Services -> Remote Desktop Connection Client -> RD Gateway Authentication Methods,确保允许PAA认证方式
6. 抓包验证请求流程
使用Fiddler或Wireshark捕获客户端与网关的HTTP请求,确认:
- 客户端是否向
/rpc/rpcproxy.dll发送请求 - 网关是否返回正确的401状态码和
RDG-Auth-Scheme: PAA头 - 客户端在收到401后是否发送包含
RDG-Access-Token头的请求
内容的提问来源于stack exchange,提问作者Zalhera
相关产品推荐
相关产品推荐

