C# 获取域用户信息并统计域用户访问过的页面
最近,公司让做个网站,因为是内网的,所以为了方便,采用域用户,而不用重新注册。
1. 下面是根据WindowsPrincipal获取当前域用户的用户名和域
using System; using System.Collections.Generic; using System.Web; using System.Security.Principal; using System.Threading; public class MyPrincipal { WindowsPrincipal wp = (WindowsPrincipal)Thread.CurrentPrincipal; /// <summary> /// 判断是否是管理员 /// </summary> public bool IsAdmin() { string adminUsers=Global.WebsiteConfig.SiteConfigValue("ga", "adminUsers"); return adminUsers.Contains(UserName + ";"); } /// <summary> /// 域用户名 /// </summary> public string UserName { get { string[] wpArray = wp.Identity.Name.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries); return wpArray.Length>0?wpArray[1]:""; } } /// <summary> /// 域 /// </summary> public string UserDomain { get { string[] wpArray = wp.Identity.Name.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries); return wpArray.Length > 0 ? wpArray[0] : ""; } } }
注 : 上面的方法有点麻烦,徐少侠 提供了一种更为简单的方法来获取域用户,如下:
首先在Web.config里面配置, 在<system.web>内添加 <identity impersonate="true" />
然后在代码中使用
System.Environment.UserDomainName
System.Environment.UserName
就ok了。再次感谢 徐少侠
2. 因为要统计域用户的访问记录,并且网站页面很多,不可能每个页面都加上统计代码,这里有两个方法解决(限于个人水平,只想到两个方法,应该还有其它方法):
a.页面基类的方式,即新建一个页面基类(BasePage),继承page类,并重写OnInit方法,将统计代码写入,然后其它页面继承BasePage就可以了。
b.HttpModule方式,新建一个asp.net 模块,将统计代码写入AcquireRequestState事件中,具体代码如下:
public class Counter : IHttpModule { /// <summary> /// You will need to configure this module in the web.config file of your /// web and register it with IIS before being able to use it. For more information /// see the following link: http://go.microsoft.com/?linkid=8101007 /// </summary> #region IHttpModule Members public void Dispose() { //clean-up code here. } public void Init(HttpApplication context) { context.EndRequest += new EventHandler(context_AcquireRequestState); } void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context; MyPrincipal mp = new MyPrincipal(); if (mp.UserName!="") { try { Log model = new Log(); model.UserName = mp.UserName; model.UserDomain = mp.UserDomain; model.Page = context.Request.Url.ToString(); model.SessionID = context.Session.SessionID; model.CreateOn = DateTime.Now.ToString("yyyy-MM-dd"); LogService service = new LogService(); if (!service.Exists(model)) { service.Insert(model); } } catch (Exception) { } } } #endregion }
注:因为要用到session,所以统计代码写在context_AcquireRequestState事件中,因为在此之前HttpRequest还未交给HttpHandler,session还不存在。并且如果用太靠前的事件,如:BeginRequest等,
WindowsPrincipal wp = (WindowsPrincipal)Thread.CurrentPrincipal; 此处会报错,可能是因为此处CurrentPrincipal还不存在吧。
水平有限,欢迎大家拍砖指正。