最近,公司让做个网站,因为是内网的,所以为了方便,采用域用户,而不用重新注册。
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还不存在吧。
水平有限,欢迎大家拍砖指正。