在Windows Server 2012 R2上,我们希望通过C#代码从Active Directory中获取用户的安全组。该应用程序是一个ASP.NET MVC5项目,由IIS托管。
首先,我们通过UserPrincipal.FindByIdentity(...)
从Active Directory中查询用户帐户。很好接下来,我们使用WindowsIdentity
类从活动目录中查询安全组。我们使用类WindowsIdentity
是因为响应非常快。
这是代码:
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标识为: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:异常:System.Security.SecurityException:用户名或密码不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51704298/