【发布时间】:2012-02-07 14:16:37
【问题描述】:
在 .NET 应用程序中,我试图通过用户名和密码对 Windows 用户、本地用户以及域用户进行身份验证。 I already tried this solution 。我获取 PrincipalContext 的代码如下所示:
protected static PrincipalContext TryCreatePrincipalContext(String domain)
{
var computerDomain = TryGetComputerDomain();
if (String.IsNullOrEmpty(domain) && String.IsNullOrEmpty(computerDomain))
return new PrincipalContext(ContextType.Machine);
else if (String.IsNullOrEmpty(domain))
return new PrincipalContext(ContextType.Domain, computerDomain);
else
return new PrincipalContext(ContextType.Domain, domain);
}
protected static String TryGetComputerDomain()
{
try
{
var domain = Domain.GetComputerDomain();
return domain.Name;
} catch
{
return null;
}
}
这适用于本地 Windows 用户和 ActiveDirectory 中的远程用户。但是,如果我尝试在一台机器上运行身份验证,则该机器已加入非 ActiveDirectory 域主机,例如。一个 Samba 服务器我得到以下异常:
System.DirectoryServices.AccountManagement.PrincipalServerDownException: Mit dem Server konnte keine Verbindung hergestellt werden. --->
System.DirectoryServices.Protocols.LdapException: Der LDAP-Server ist nicht verfügbar.
bei System.DirectoryServices.Protocols.LdapConnection.Connect()
bei System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest request, Int32& messageID)
bei System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
bei System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
bei System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
bei System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
bei System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)
bei System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name)
bei DomainAuthTest.DomainAuthenticator.TryCreatePrincipalContext(String domain)
bei DomainAuthTest.DomainAuthenticator.Authenticate(String domainUser, String password)
bei DomainAuthTest.Program.Main(String[] args)
因此,在 ContextType.Domain 的情况下,PrincipalContext 似乎尝试使用 LDAP。如果我尝试使用 ContextType.Machine 我无法使用工作组/域名,因为 PrincipalContext 尝试直接连接到机器。如果已经有来自同一台计算机的窗口与该计算机的连接,则该操作失败。
所以我的问题是:
- 如何根据域主服务器(不一定基于 ActiveDirectory)使用凭据域、用户名和密码对用户进行身份验证?
- 是否有用于完成上述任务的托管 API?
- 如果没有托管的基础课程,那么正确的方向是什么?
感谢您的回复。
【问题讨论】:
标签: c# .net windows winapi authentication