验证Windows身份标识

时间:2012-06-28 04:38:33

标签: c# token windows-authentication identity

我正在尝试开发一个简单的Web服务来使用Windows身份框架对桌面应用程序的用户进行身份验证,目前我正在通过post变量传递WindowsIdentity.GetCurrent().Token生成的令牌(它是加密的并且是ssl'd ,鉴于我们域的布局和服务器的配置,Windows身份验证不是一个选项。我正在将令牌传回来并将其转换回IntPtr

我很遗憾如何验证令牌以确保它是由特定的Active Directory(或任何相关的)生成的。我试图在给定令牌的情况下创建一个新的WindowsIdentity实例但是这只会导致异常(消息:用于模拟的无效令牌 - 它不能重复)。

如果有人能提供任何帮助甚至提示,我将非常感谢,提前谢谢。

2 个答案:

答案 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;
    }


}