gpt4 book ai didi

c# - WindowsIdentity : Exception: System. Security.SecurityException: 用户名或密码不正确

转载 作者:行者123 更新时间:2023-11-30 18:13:59 26 4
gpt4 key购买 nike

在 Windows Server 2012 R2 上,我们希望通过 C# 代码从 Active Directory 中获取用户的安全组。该应用程序是一个 ASP.NET MVC5 项目,由 IIS 托管。

首先,我们通过 UserPrincipal.FindByIdentity(...) 从 Active Directory 中查询用户帐户.那很好用。接下来,我们使用 WindowsIdentity类从事件目录中查询安全组。我们使用类 WindowsIdentity因为 react 非常快。

代码如下:

var lDomain = "MyDomain";
var lSamAccountName = "Simon";

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, lDomain))
{
// Get User Account from Active Directory
using (UserPrincipal lUserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, lSamAccountName))
{
var lUpn = lUserPrincipal.UserPrincipalName; // get UPN

// get Security Groups of the user
using (WindowsIdentity lWindowsIdentity = new WindowsIdentity(lUpn)) // Exception: System.Security.SecurityException: The user name or password is incorrect
{
var lGroups = lWindowsIdentity.Groups;
}
}
}

问题:在实例化 WindowsIdentity 时类(并传递 UPN)然后发生异常:

“Upn: 'simon@MyDomain' Exception: System.Security.SecurityException: The user name or password is incorrect.
at System.Security.Principal.WindowsIdentity.KerbS4ULogon(String upn, SafeAccessTokenHandle& safeTokenHandle)
at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName, String type)
at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName)
at ...

这很好奇,因为带有 UserPrincipal.FindByIdentity(...) 的查询那是成功的。一些帐户正在运行。某些帐户无法使用。我找不到工作帐户和非工作帐户之间的区别。

问题:谁知道我做错了什么?

附加说明:

  • Applicationpool Identity 是:LocalSystem
  • 在 Web.config 中,有以下条目:<identity impersonate="false" />
  • 当我通过以下替代方法查询组时,没有发生异常并且结果令人满意。这很好奇:

    var lResult = new List<SecurityIdentifier>();
    DirectorySearcher lDirectorySearcher = new DirectorySearcher();
    lDirectorySearcher.Filter = string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)(distinguishedName={0}))", lUserPrincipal.DistinguishedName); // for the object lUserPrincipal, look @ code above
    lDirectorySearcher.SearchScope = SearchScope.Subtree;
    SearchResult lSearchResult = lDirectorySearcher.FindOne();

    DirectoryEntry lDirectoryEntry = lSearchResult.GetDirectoryEntry();

    lDirectoryEntry.RefreshCache(new string[] { "tokenGroups" });

    // get groups
    for (int i = 0; i < lDirectoryEntry.Properties["tokenGroups"].Count; i++)
    {
    SecurityIdentifier lSid = new SecurityIdentifier((byte[])lDirectoryEntry.Properties["tokenGroups"][i], 0);
    lResult.Add(lSid);

    // Translate into NTAccount to get Domain and SAMAccountname etc...
    [...]
    }

最佳答案

我真的不知道这是否有帮助,但我在某个地方发现了这个:

  • 如果 IIS 设置为允许匿名访问,您可以使用 userPrincipleName 格式 (username@domain)。
  • 如果 IIS 中未启用匿名访问,您需要使用 domain\username 格式的用户名。

虽然对于某些帐户 UPN 有效而对于其他帐户却无效,这似乎很奇怪..

关于c# - WindowsIdentity : Exception: System. Security.SecurityException: 用户名或密码不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51704298/

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