【问题标题】:IIS logs not showing 'cs-username' field for .NET Core applicationIIS 日志未显示 .NET Core 应用程序的“cs-username”字段
【发布时间】:2021-03-21 22:38:24
【问题描述】:

我有两个在 IIS 8.5 中运行的现有应用程序,一个是 ASP.NET,另一个是 .NET Core。 ASP.NET 应用程序在 IIS 日志中正确写入 cs-username 字段,但 .NET Core 应用程序仅显示连字符。

我找到了一个article 和一个forum post,它们建议在applicationhost.config 文件中添加一些xml,但我没有它所指的<advancedlogging> 分支。

如果解决方案是简单地按照文章进行操作,那么有人可以解释为什么我的配置文件没有像他们那样格式化以及我应该将建议的 xml 放在哪里?否则,是否有任何人都知道的唯一解决方案?

【问题讨论】:

标签: .net logging iis w3c


【解决方案1】:

您是否在 iis 中使用匿名身份验证?这应该是cs-username不显示的原因,如果你在asp.net核心应用中使用windows认证你会填充cs-username。

在 ASP.NET 中,它是 IIS 处理管道中的一个 ISAPI 过滤器。因此,IIS 可以访问该信息并记录它。 ASP.Net 核心应用程序并非如此。 Aspnet 核心使用其自己的称为 kestrel 的 Web 服务器,而 IIS 仅充当代理。从技术上讲,IIS 不知道该请求\响应发生了什么。它只是接收请求并将响应提供给请求者。

【讨论】:

    【解决方案2】:

    在 asp.net 核心应用程序和 IIS 中记录用户名有两种解决方法。

    1. 在核心应用程序中将用户添加到服务器变量,然后在 IIS 中记录自定义字段。这仅在使用进程内托管模型时有效。

    在您的应用中添加:

    app.UseAuthentication();
    app.Use(async (context, next) =>
    {
        if (context.User.Identity.IsAuthenticated && context.Features.Get<IServerVariablesFeature>() is IServerVariablesFeature serverVariables)
        {
            serverVariables["AUTH_USER"] = context.User.Identity.Name;
            serverVariables["AUTH_TYPE"] = context.User.Identity.AuthenticationType;
        }
        await next.Invoke();
    });
    

    在您的 IIS 站点中转到 Logging &gt; Select Fields &gt; Add Field。设置字段名称:auth-user,源类型:服务器变量,源:AUTH_USER。接受并应用所有更改。

    使用自定义字段确实会导致 IIS 使用不同的日志文件名。您可能需要更新监控应用程序或脚本才能看到这些文件。

    1. 使用W3C Logger middleware。这不会记录到 IIS 日志文件,但会在其自己的日志文件中记录 cs-username。您需要允许应用程序池对您选择登录的文件夹具有写入权限。这也意味着您可能会记录两次相同的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2012-06-06
      • 2021-11-04
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多