验证Windows身份标识

mit*_*lsg 13 c# identity token windows-authentication

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

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

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

Eri*_*mes 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;
    }


}
Run Code Online (Sandbox Code Playgroud)