当前登录用户的用户名或程序标识(如果没有)(Owin IIS /自托管)

时间:2015-02-19 14:36:20

标签: windows asp.net-identity windows-authentication owin claims-based-identity

我正在做一个更通用的日志记录库,它在IIS(Owin)中运行,或者作为自托管(Owin)Windows服务运行。我想要包含的一条记录信息按优先顺序排列:

  1. 经过身份验证的(已登录)用户的名称。
  2. 如果1.不可用,则运行该进程的帐户。这可能是运行IIS应用程序池的位置,也可能是运行Windows服务的帐户。
  3. 模拟目前并不重要,我主要感兴趣的是IIS开启/关闭Windows身份验证或使用OAuth并且它作为加入域的计算机运行(开发人员/ CI计算机可以只是&# 34;某些东西"并且没有从外面获得)。我看到的问题是有很多方法可以获取这些信息,但哪一种方法在我描述的场景中有效?我发现 Rich Hewlett 撰写了一篇非常有用的博文Getting A Users Username in ASP.NET,其中特别是以下几点回答了这个问题

    Scenario 2: Windows Authentication in IIS, impersonation off.
    +------------------------------------------------------+------------------+
    | HttpContext.Current.Request.LogonUserIdentity.Name   | MYDOMAIN\USER1   |
    | HttpContext.Current.Request.IsAuthenticated          | True             |
    | HttpContext.Current.User.Identity.Name               | MYDOMAIN\USER1   |
    | System.Environment.UserName                          | ASPNET           |
    | Security.Principal.WindowsIdentity.GetCurrent().Name | COMPUTER1\ASPNET |
    +------------------------------------------------------+------------------+
    

    在这里看来,我只需要检查IsAuthenticated是否为真,如果是,请从LogonUserIdentity获取用户名,如果不是,则从当前WindowsIdentity获取。这不一定适用于自我托管的Owin(我还没有检查过)。此外,我发现最近有很多事情围绕着索赔发生。

    所以,我正在寻找更简单的东西,比如

    //This may be empty...
    var userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name);
    
    //It looks like there's always something here...
    var userId2 = WindowsIdentity.GetCurrent().FindFirst(ClaimTypes.Name);
    
    //Or should this work...
    string userId = string.Empty;
    if(ClaimsPrincipal.Current.Identity.IsAuthenticated)
    {
        userId = ClaimsPrincipal.Current.Identity.Name;
    }
    else
    {
        userId = WindowsIdentity.GetCurrent().Name;
    }
    

    并希望当有人决定在IIS上打开或关闭Windows身份验证或将其更改为OAuth时,将会介绍该问题。事实上,最好也是自我托管的Owin应用程序。

0 个答案:

没有答案