UWP VPN应用连接时用户名自动添加?\前缀的问题
解决UWP VPN连接时用户名被自动添加前缀的问题
问题场景
通过UWP应用创建IKEv2类型的VPN配置,使用EAP/MS-CHAPv2认证,连接代码如下:
public async void connect() { var config = @" <VPNProfile> <ProfileName>testConnection</ProfileName> <NativeProfile> <Servers>***.**.**.***</Servers> <RoutingPolicyType>SplitTunnel</RoutingPolicyType> <NativeProtocolType>IKEv2</NativeProtocolType> <Authentication> <UserMethod>Eap</UserMethod> <Eap> <Configuration> <EapHostConfig xmlns=""http://www.microsoft.com/provisioning/EapHostConfig""> <EapMethod> <Type xmlns = ""http://microsoft.com/provisioning/EapCommon"">26</Type> <VendorId xmlns = ""http://microsoft.com/provisioning/EapCommon"">0</VendorId> <VendorType xmlns = ""http://microsoft.com/provisioning/EapCommon"">0</VendorType> <AuthorId xmlns = ""http://microsoft.com/provisioning/EapCommon"">0</AuthorId> </EapMethod> <Config xmlns = ""http://microsoft.com/provisioning/EapHostConfig""> <Eap xmlns = ""http://microsoft.com/provisioning/BaseEapConnectionPropertiesV1""> <Type>26</Type> <EapType xmlns = ""http://microsoft.com/provisioning/MsChapV2ConnectionPropertiesV1""> <UseWinLogonCredentials>false</UseWinLogonCredentials> </EapType> </Eap> </Config> </EapHostConfig> </Configuration> </Eap> </Authentication> </NativeProfile> <RequireVpnClientAppUI>true</RequireVpnClientAppUI> <RememberCredentials>true</RememberCredentials> </VPNProfile>"; VpnManagementErrorStatus profileStatus = await windowsVpnManager.AddProfileFromXmlAsync(config); var profiles = await windowsVpnManager.GetProfilesAsync(); // 注意:原代码此处存在错误,ProfileName应为testConnection而非testProfile var profile = profiles.First(p => p.ProfileName == "testConnection") as VpnNativeProfile; var connectionStatus = await windowsVpnManager.ConnectProfileWithPasswordCredentialAsync(profile, new PasswordCredential { UserName = "test", Password = "test123" }); Debug.Print($"Connection status -> {connectionStatus}"); }
连接时服务器日志显示收到的EAP身份为?\test,原本设置的用户名test被自动添加了前缀。
问题原因
这是Windows EAP/MS-CHAPv2认证的默认行为:当传入的用户名未包含域名或工作组前缀时,系统会自动添加当前本地机器的上下文前缀(通常是计算机名或默认工作组),导致服务器收到带前缀的用户名。
解决方案
1. 修改EAP配置,强制指定纯用户名
在EAP的MsChapV2配置节点中添加<Username>字段,直接指定纯用户名,同时确保<UseWinLogonCredentials>保持false,避免系统注入本地凭据信息。修改后的EAP配置部分如下:
<EapType xmlns = "http://microsoft.com/provisioning/MsChapV2ConnectionPropertiesV1"> <UseWinLogonCredentials>false</UseWinLogonCredentials> <Username>test</Username> </EapType>
如果需要动态设置用户名,可以在生成XML配置时拼接该字段的值。
2. 使用ConnectProfileAsync配合VpnCredentials替代ConnectProfileWithPasswordCredentialAsync
PasswordCredential对象会被系统自动处理上下文信息,改用VpnCredentials可以更精准地控制传递给VPN的凭据内容,避免前缀注入。修改后的连接代码片段:
// 获取profile后,替换原连接代码 var vpnCredentials = new VpnCredentials(); vpnCredentials.UserName = "test"; vpnCredentials.Password = "test123"; var connectionStatus = await windowsVpnManager.ConnectProfileAsync(profile, vpnCredentials);
3. 修正原代码中的ProfileName匹配错误
原代码中创建的VPN配置名称为testConnection,但获取时使用的是testProfile,这会导致找不到对应配置,必须修正为一致的名称才能正常连接。
内容的提问来源于stack exchange,提问作者Leyter
相关产品推荐
相关产品推荐

