gpt4 book ai didi

winforms - 通过事件目录进行 Winform 用户授权

转载 作者:行者123 更新时间:2023-12-04 11:44:10 24 4
gpt4 key购买 nike

我有一种情况,在我的应用程序中执行任务之前,我使用以下代码来验证 AD 中的用户成员身份

using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole("someGroup");

上面的代码适用于我域中的机器,但是我确实有一些机器不在我的域中,我安装了 WINFORM 应用程序。如何验证 AD 中的用户成员身份?

编辑 - 有没有办法提示 Windows 登录?

最佳答案

由于您的计算机根本未加入域,因此我们无法使用 WindowsIdentity 或 WindowsPrincipal 然后检查其 IsInRole() 方法。 IsInRole() 方法仅在您的计算机加入域并且使用您的域计算机帐户执行 S4USelf 时才有效。

您也不能使用 LogonUser 方法,因为您的计算机不允许您从不受信任的林创建登录 session 。

我想我们只能直接查询Active Directory,才能得到我们想要的信息。据我所知,您发布的 Microsoft KB 中的代码效果不佳。它试图从 memberOf 属性进行查询。组信息并不总是可以从 memberOf 属性中获得。

我刚刚使用 AccountManagement 编写了一个 IsInRole() 函数。我想这就是你想要的。 IsInRole() 函数将调用递归函数 IsInGroup() 来找出用户所属的所有组。

private bool IsInRole(string domain, string username, string password, string role)
{
using (var context = new PrincipalContext(ContextType.Domain, domain, username, password))
{
GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role);
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);
return IsInGroup(user, group);
}
}

private bool IsInGroup(Principal principal, GroupPrincipal group )
{
if (principal.IsMemberOf(group))
return true;

foreach (var g in principal.GetGroups())
{
if (IsInGroup(g, group))
return true;
}

return false;
}

要使用此 IsInRole() 函数,您需要提供您的域名和域凭据。如果提供的用户名和密码错误,您将收到异常。

您需要 .NET 3.5 SP1 才能使用 AccountManagement API。另外,你可能要关注这个 hotfix .如果在某些环境中运行,AccountManagement API 会出现一些错误。您可能需要应用修补程序。

关于winforms - 通过事件目录进行 Winform 用户授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com