mit*_*lsg 13 c# identity token windows-authentication
我正在尝试使用windows身份框架开发一个简单的Web服务来验证桌面应用程序的用户,目前我传递的是WindowsIdentity.GetCurrent().Token通过post变量生成的令牌(它是加密的和ssl'd,Windows身份验证不是给定的选项我们的域的布局和服务器的配置).我正在将令牌传回来并将其转换回来IntPtr.
我很遗憾如何验证令牌以确保它是由特定的Active Directory(或任何相关的)生成的.我试图在WindowsIdentity给定令牌的情况下创建一个新实例但是只会导致异常(消息:用于模仿的无效令牌 - 它不能重复).
如果有人能提供任何帮助甚至提示,我将非常感谢,提前谢谢.
出色地,
如果我正确理解你的问题,我知道可以通过直接 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)