14

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

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

如果有人可以提供任何帮助甚至提示,我将不胜感激,在此先感谢。

4

2 回答 2

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()如果用户在您的用户组中,这将返回真/假。(将 DOMAIN 替换为您需要的组名。)

于 2014-08-07T10:49:43.590 回答
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;
    }


}
于 2014-07-11T21:21:37.510 回答