[英]Get username with Windows Authentication and anonymous authentication
我有2个共享公用数据库的MVC应用程序。 一个位于Internet服务器上,对GateKeeper数据库使用匿名身份验证,另一个位于Intranet服务器上,对Active Directory使用Windows身份验证。
我想通过重写EntityFramework的SaveChanges方法来实现审核跟踪。 在此替代中,我要记录已登录用户的用户名。 在外部站点上,它将是电子邮件地址,在内联网站点上,它将是AD帐户名。
这两个应用程序都使用集成的安全性来连接到数据库,因此它们都在可以访问数据库的通用应用程序池帐户上运行。
我已经尝试使用Environment.UserName
和System.Security.Principal.WindowsIdentity.GetCurrent()。Name,但是都给了我应用程序池用户帐户,一个没有域:
UserName = Environment.UserName //{ result = CAPETOWN\global-custom }
UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name //{ result = global-custom }
如何获得所需的用户名
好吧,你可以试试这个
HttpContext.User.Identity.Name
尝试这个:
string UserName = HttpContext.Current.User.Identity.Name;
尽管如果您以特定的方式编写代码,这将不适合设计,请为您的答案添加更多细节。
您可以获得在其上执行操作的屏幕的URL字符串_urlOfEntity = Url = HttpContext.Current.Request.CurrentExecutionFilePath;
要覆盖SaveChanges()方法,可以使用
审核代码编辑操作:
public int SaveChanges(object _olderInstance)
{
foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Modified || p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted))
{
// For each changed record, get the audit record entries and add them
//foreach (XmlTesst x in GetAuditRecordsForChange(ent))
//{
this.XmlTessts.Add(GetAuditRecordsForChange(ent));
//}
}
// Call the original SaveChanges(), which will save both the changes made and the audit records
return base.SaveChanges();
}
public XmlTesst GetAuditRecordsForChange(DbEntityEntry dbEntry)
{
string tableName, eventtype;
XmlTesst XmlForReturn;
if (dbEntry.State == System.Data.EntityState.Modified)
{
TableAttribute tableAttr = dbEntry.Entity.GetType().GetCustomAttributes(typeof(TableAttribute), false).SingleOrDefault() as TableAttribute;
// Get table name (if it has a Table attribute, use that, otherwise get the pluralized name)
tableName = tableAttr != null ? tableAttr.Name : dbEntry.Entity.GetType().Name;
XmlDocument XmlCurrentDoc = new XmlDocument();
XmlNode rootNodeCurrent = XmlCurrentDoc.CreateElement(tableName);
XmlCurrentDoc.AppendChild(rootNodeCurrent);
XmlDocument XmlOldDoc = new XmlDocument();
XmlNode rootNodeOld = XmlOldDoc.CreateElement(tableName);
XmlOldDoc.AppendChild(rootNodeOld);
foreach (string propertyName in dbEntry.OriginalValues.PropertyNames)
{
object CurrentValues = dbEntry.CurrentValues.GetValue<object>(propertyName);
object OriginalValues = dbEntry.Entity.GetType().GetProperty(propertyName).GetValue(_olderInstancea, null);
if (!object.Equals(dbEntry.Entity.GetType().GetProperty(propertyName).GetValue(_olderInstancea, null), CurrentValues) && (OriginalValues != null || CurrentValues != null))
{
XmlNode userNodeCurrent = XmlCurrentDoc.CreateElement(propertyName);
userNodeCurrent.InnerText = CurrentValues.ToString();
rootNodeCurrent.AppendChild(userNodeCurrent);
XmlNode userNodeOld = XmlOldDoc.CreateElement(propertyName);
if (OriginalValues == null)
{
userNodeOld.InnerText = "Not Assigned ";
rootNodeOld.AppendChild(userNodeOld);
}
else
{
userNodeOld.InnerText = OriginalValues.ToString();
rootNodeOld.AppendChild(userNodeOld);
}
}
}
XmlForReturn = new XmlTesst() { OriginalXml = GetXMLAsString(XmlOldDoc), CurrentXml = GetXMLAsString(XmlCurrentDoc), EventType = "Edited", TimeofActivity = DateTime.Now, UserName = HttpContext.Current.User.Identity.Name, Url = HttpContext.Current.Request.CurrentExecutionFilePath, Screen = tableName };
return XmlForReturn;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.