如何使用User.Identity.Name在Controller外部的类中工作?

时间:2013-07-10 03:16:52

标签: asp.net-mvc asp.net-mvc-4 iis-7.5 windows-authentication

如何使用User.Identity.Name在Controller之外的类中工作? 我只是在课内使用

private readonly static string sLogon =  HttpContext.Current.User.Identity.Name.Substring(HttpContext.Current.User.Identity.Name.LastIndexOf(@"\") + 1);

它重新启动IIS 7.5生产服务器上的空引用,即使它适用于开发服务器。

在这里,我使用了一些替代方案。

  • 起初我使用Environment.Username。哪个在开发中很有效。但不是在出版后。因为Environment.Username会生成应用程序运行的应用程序池的名称。如上所述here
  • Controller.User.Identity.Name用于在控制器中获取所需的用户名,适用于发布前和发布后。但它不能在Class .cs的上下文中使用。
  • System.Web.HttpContext.Current.User.Identity.Name产生空引用。
  • System.Security.Principal.WindowsIdentity.GetCurrent().NameEnvironment.Username
  • 的工作方式相同

您对如何使用它有什么想法吗?感谢

更新

根据环境,如果我获得登录ID,我可以从Employee表中获取员工信息,如EmployeeID,Email等。例如:我有一个类(在控制器之外)从Employee表中获取员工ID以便像这样访问。

string EmployeeID = new EmployeeService().EmployeeID();

private readonly static string sLogon =  HttpContext.Current.User.Identity.Name.Substring(HttpContext.Current.User.Identity.Name.LastIndexOf(@"\") + 1);

public string EmployeeID()
        {
            var employee = new Common().Employee();

            string sID = (from e in employee
                          where (e.LogonID ?? "N/A").ToLower().Contains(sLogon.ToLower())
                          select e.EmployeeID).FirstOrDefault();

            return sID;
        }

1 个答案:

答案 0 :(得分:0)

根据反映的代码,在Windows身份验证OnAuthenticate事件期间设置HttpContext.Current.User。

// System.Web.Security.WindowsAuthenticationModule
private void OnAuthenticate(WindowsAuthenticationEventArgs e)
{
    if (this._eventHandler != null)
    {
        this._eventHandler(this, e);
    }
    if (e.Context.User == null)
    {
        if (e.User != null)
        {
            e.Context.User = e.User;
            return;
        }
        if (e.Identity == WindowsAuthenticationModule.AnonymousIdentity)
        {
            e.Context.SetPrincipalNoDemand(WindowsAuthenticationModule.AnonymousPrincipal, false);
            return;
        }
        e.Context.SetPrincipalNoDemand(new WindowsPrincipal(e.Identity), false);
    }
}

可能需要检查生产服务器上是否启用了Windows身份验证并禁用了匿名身份验证。

http://technet.microsoft.com/en-us/library/cc754628(v=WS.10).aspx