求助:
现在用.NET做一个bs系统,客户要求和他们其他系统一样,都集成域用户登录,即:在系统中不用输入用户名,密码,通过windows域用户验证的客户即可登录系统。所以我在自己开发的系统中,对域用户和用户做了一个关联。现在需要实现的就是客户端通过IE浏览系统的时候,服务器端如何获取到客户端机器所在的域用户信息?在网上搜索了很多,效果不佳,望实现过的朋友给予帮助,谢谢!qq:254185950
现在用.NET做一个bs系统,客户要求和他们其他系统一样,都集成域用户登录,即:在系统中不用输入用户名,密码,通过windows域用户验证的客户即可登录系统。所以我在自己开发的系统中,对域用户和用户做了一个关联。现在需要实现的就是客户端通过IE浏览系统的时候,服务器端如何获取到客户端机器所在的域用户信息?在网上搜索了很多,效果不佳,望实现过的朋友给予帮助,谢谢!qq:254185950
解决方案 »
- 当GridView为TemplateField时,如何获取单元格文本值?
- httpHandlers 出问题了 可以看看不(过滤url敏感字符)
- 我想做个论坛发帖功能
- 怎么实现,编辑短信内容XX到XX,扣除手机费的这套技术?
- 如何通过数据库生成.NET导航菜单???
- 精通Silverlight 1.0的请进来帮个忙
- ReportService2000 如何使用带参数存储过程作为数据源-200在线等
- 图片缓存的处理!
- 新人求助,DEVEXPRESS ASPXTEXTBOX
- asp程序无法连接到数据库,我的系统是2000sever,数据库是access
- 多语言支持遇到问题:母版页嵌套情况下无法切换到设计视图,本地资源文件无法生成!
- GridView绑定数据源时多条件查询
看这个行不行
传送门
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices; //必要引用
using System.Security.Principal; //必要引用
/**//// <summary>
/// UserLoginForDomain 的摘要说明
/// 适用ASP.NET 2.0
/// Windows XP 调试成功
/// 调用”advapi32.dll“win32 API
/// </summary>namespace UserLoginForDomain
{
public class UserLoginForDomainDAO
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0; WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int LogonUser(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
public extern static int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
/**/
/// <summary>
/// 输入用户名、密码、登录域判断是否成功
/// </summary>
/// <example>
/// if (impersonateValidUser(UserName, Domain, Password)){}
/// </example>
/// <param name="userName">账户名称,如:string UserName = UserNameTextBox.Text;</param>
/// <param name="domain">要登录的域,如:string Domain = DomainTextBox.Text;</param>
/// <param name="password">账户密码, 如:string Password = PasswordTextBox.Text;</param>
/// <returns>成功返回true,否则返回false</returns>
public bool impersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero; if (LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
return true;
else
return false;
}
else
return false;
}
else
return false;
} public void undoImpersonation()
{
impersonationContext.Undo();
}
//
// TODO: 在此处添加构造函数逻辑
//
}
}
可以用这个类判断用户名和密码是否是域用户的。
iis设置Windows访问,也需要输入用户名和密码的,很难拿到当前登录的用户名和密码来直接验证,还不如让客户自己输入一次。
2、web.config中启用windows验证。
3、拿到域中遍历看是否有此用户名(using System.DirectoryServices)。
4、ie中安全设置-用户验证中填入自动获取用户名和密码(这个恐怕是LZ最想知道的)。
/// APAC为域名
/// </summary>
/// <param name="usrId"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public static bool IsAPACUser(string usrId, string pwd)
{
try
{
using (DirectoryEntry de = new DirectoryEntry())
{
de.Path = "LDAP://APAC";
de.Username = "APAC\\" + usrId;
de.Password = pwd;
DirectorySearcher search = new DirectorySearcher(de);
search.Filter = "(SAMAccountName=" + usrId + ")";
search.PropertiesToLoad.Add("CN");
SearchResult r = search.FindOne();
if (r == null)
{
de.Close();
return false; }
else
{
de.Close();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
}
string[] LoginUserArr = LoginUser.Split('\\');
//取用户ID
string UserID = LoginUserArr[1];
//取域名
string DomainID = LoginUserArr[0];
用取到用户ID跟系统表中的数据比较
跟传统方式一样。不说了
输入域用户名跟密码 遍历域中是否有该用户
using System.DirectoryServices;/// <summary>
/// APAC为域名
/// </summary>
/// <param name="usrId"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public static bool IsAPACUser(string usrId, string pwd)
{
try
{
using (DirectoryEntry de = new DirectoryEntry())
{
de.Path = "LDAP://APAC";
de.Username = "APAC\\" + usrId;
de.Password = pwd;
DirectorySearcher search = new DirectorySearcher(de);
search.Filter = "(SAMAccountName=" + usrId + ")";
search.PropertiesToLoad.Add("CN");
SearchResult r = search.FindOne();
if (r == null)
{
de.Close();
return false; }
else
{
de.Close();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
}
方式二:取域用户名,跟数据库中的用户表做比较 string LoginUser = Request.ServerVariables["LOGON_USER"];
string[] LoginUserArr = LoginUser.Split('\\');
//取用户ID
string UserID = LoginUserArr[1];
//取域名
string DomainID = LoginUserArr[0];用取到用户ID跟系统表中的数据比较
跟传统方式一样。不说了
居然也可以访问页面,并且 string LoginUser = Request.ServerVariables["LOGON_USER"];得到的信息是域的信息【GOTOID\Adinistrator】,不知道为什么? 由于禁止了匿名访问,集成了windows访问,按道理,非域中的计算机,访问网站,应该弹出输入用户名,密码的窗体,是域中账户才可以访问到页面,否则页面提示无法访问等。
而非域中的用户,通过这个 user.identity.name 也能返回信息,并且域名也是正常的。很疑惑
你的IIS中那个认证那边选择windows集成认证你的代码中可以用page.user来得到登陆的用户