首页 > 解决方案 > IIS 日志未显示 .NET Core 应用程序的“cs-username”字段

问题描述

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

我发现一篇文章和一篇论坛帖子建议在 applicationhost.config 文件中添加一些 xml,但我没有<advancedlogging>它所指的分支。

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

标签: .netloggingiisw3c

解决方案


我有两种解决方法可以在 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 > Select Fields > Add Field. 设置字段名称:auth-user,源类型:服务器变量,源:AUTH_USER。接受并应用所有更改。

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

(当身份验证服务接受请求但没有足够信息了解所有详细信息时,名称可以为空。例如,没有肥皂名称属性的 SAML 请求。我使用 ? 将其与匿名区分开来 - 在日志。)

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

推荐阅读