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还不存在吧。
水平有限,欢迎大家拍砖指正。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号