You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:54:59