使用 VPN 并获得“此工作站与主域之间的信任关系失败”

问题描述

我们正在为一个客户开发,该客户要求我们使用他们的 VPN 来访问他们的数据库资源,而不是我们的。我们正在使用 Windows 来获取主要身份,我们只关心用户名作为我们前进的关键:

 services.AddAuthentication(IISDefaults.AuthenticationScheme);

然后我们添加自己的包含角色的表驱动身份:

//...Get the user name from AD.
var claimsIdentity = (ClaimsIdentity)principal.Identity;
string domainName = "";
string userName = claimsIdentity.Name;
if (claimsIdentity.Name.Contains("\\"))
{
  domainName = claimsIdentity.Name.Split("\\")[0];
  userName = claimsIdentity.Name.Split("\\")[1];
}
//...Use the userName in the database to get the primary roles.....
ourIdentityClaims.Add(new Claim(ClaimTypes.Role,userInfo.Roles.First().Name));
//...Add our custom identity with the claims.
principal.AddIdentity(new ClaimsIdentity(ourIdentityClaims,"OurIdentity"));

然后我们授权控制器(或其他):

    [Authorize(Roles = "Technician")]
//...or just...
    [Authorize]
    public class WhateverController : Controller

在基于角色的身份验证方面非常标准的东西。

如果我们在我们的 vpn 上运行它(不是客户端并使用模拟数据),那么一切都很好。但是,当我们继续使用客户端的 vpn 并断开我们的 vpn 时,我们得到“此工作站与主域之间的信任关系失败。”

当然这是完全合理的,因为我们的 PC 注册到的域与我们当前使用的 VPN 不匹配。因此,您在那里看到的有关删除添加到域的所有其他建议在此处并不真正适用。我们还认识到,一旦客户在其 VPN 上的 PC 上使用该应用程序,一切都会好起来的。因此,在我们都使用 VPN 的世界中,这实际上只是一个发展问题!

我该如何解决这个问题?请记住,我不关心 Windows AD 中除此人的用户名之外的任何内容。我不关心 AD 组或任何其他组。我们通过在 ClaimsLoader 中添加到主要用户的本地表和自定义身份自行处理所有角色管理。但我们确实需要用户名

我有很多想法,但它们都非常广泛。我很好奇是否有一种简单的方法来编写一些标记代码的开发环境来说明......“是的,是的......我们不在普通域......我们不在乎。”

解决方法

另一个相似但不同的问题让我偶然发现了答案。显然,只需在我的 ClaimsTransformation 中将主体复制到新主体,就可以将其与在未来角色检查中所做的任何事情分离。

它没有完全的意义,但它正在工作......

旧代码:

        public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            \\....My code to build myClaims.

            principal.AddIdentity(new ClaimsIdentity(myClaims,"MyNewIdentity"));
            return await Task.FromResult(principal);
         }


新代码:

        public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            \\....My code to build myClaims.

            var newPrincipal = new ClaimsPrincipal(principal);
            newPrincipal.AddIdentity(new ClaimsIdentity(myClaims,"MyNewIdentity"));
            return await Task.FromResult(newPrincipal);
         }