我正在尝试开发一个简单的Web服务来使用Windows身份框架对桌面应用程序的用户进行身份验证,目前我正在通过post变量传递WindowsIdentity.GetCurrent().Token
生成的令牌(它是加密的并且是ssl'd ,鉴于我们域的布局和服务器的配置,Windows身份验证不是一个选项。我正在将令牌传回来并将其转换回IntPtr
。
我很遗憾如何验证令牌以确保它是由特定的Active Directory(或任何相关的)生成的。我试图在给定令牌的情况下创建一个新的WindowsIdentity
实例但是这只会导致异常(消息:用于模拟的无效令牌 - 它不能重复)。
如果有人能提供任何帮助甚至提示,我将非常感谢,提前谢谢。
答案 0 :(得分:1)
public bool DoesUserExist(string userName)
{
using (var domainContext = new PrincipalContext(ContextType.Domain, "DOMAIN"))
{
using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName))
{
return foundUser != null;
}
}
}
实现检查用户是否存在。这来自System.DirectoryServices.AccountManagement
命名空间和程序集。
只需传入您可以从WindowsIdentity.GetCurrent()
获取的用户名,如果用户在您的用户组中,则会返回true / false。 (将DOMAIN替换为您需要的组名。)
答案 1 :(得分:0)
那么,
如果我正确理解了您的问题,我知道可以直接进行API调用。 advapi32.dll中的LogonUser就是答案。以下代码段为我工作
public class ActiveDirectoryHelper
{
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
public static bool Authenticate(string userName, string password, string domain)
{
IntPtr token;
LogonUser(userName, domain, password, 2, 0, out token);
bool isAuthenticated = token != IntPtr.Zero;
CloseHandle(token);
return isAuthenticated;
}
public static IntPtr GetAuthenticationHandle(string userName, string password, string domain)
{
IntPtr token;
LogonUser(userName, domain, password, 2, 0, out token);
return token;
}
}