【问题标题】:Populating IIS User Name via ASP .NET MVC?通过 ASP .NET MVC 填充 IIS 用户名?
【发布时间】:2020-06-02 23:58:13
【问题描述】:

对于我们的系统,我们有各种通过 .NET MVC 在内部处理的 Web API 调用。这些是通过令牌标头使用 AuthorizeAttribute 授权的通用 Web 调用,这意味着我们的 IIS 日志显示匿名用户。如果可能,我们希望填充该用户名。我认为使用 IAuthenticationFilter 并更新 Principal 可以解决问题,但是生成的 IIS 日志的用户名是空白的(匿名)。示例代码如下:

public class UserAuthenticateAttribute : Attribute, IAuthenticationFilter
{
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        //Uses data from within context.ActionContext to populate user data
        context.Principal = new GenericPrincipal(new GenericIdentity("Test User"), null);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        return Task.FromResult(0);
    }
    public virtual bool AllowMultiple { get { return false; } }
}

我猜测 IIS 日志是在发送请求时生成的,在 AuthenticateAsync 获取之前。有没有办法被 IIS 日志记录下来?

【问题讨论】:

    标签: c# asp.net asp.net-mvc iis iis-7


    【解决方案1】:

    IIS 将记录应用程序池标识而不是网站标识。

    如果您在 IIS 身份验证模式下禁用“匿名身份验证”,您的用户将不得不针对网站进行身份验证。假设我们启用了 Windows 身份验证,IIS 将记录网络凭据。

    字段:日期时间 s-ip cs-method cs-uri-stem c-uri-query s-port cs-username c-ip cs(User-Agent) c(Referer) sc-status sc-substatus H1>

    sc-win32-status 耗时 2020-06-04 07:27:48 fe80::a4fe:6d79:f2b8:d031%6 获取 / - 8002 VABQIA969VM\Administrator fe80::a4fe:6d79:f2b8:d031%6 Mozilla/5.0+(Windows+NT+10.0;

    但是,网站身份是另一回事,它不会记录在 IIS 日志中。 有关详细信息,请参阅此链接。
    https://serverfault.com/questions/40328/in-iis-7-0-what-is-the-difference-between-the-application-pool-identity-and-the
    为了记录网站身份,建议你使用 Asp.Net Core 内置的记录机制。
    https://www.tutorialsteacher.com/core/aspnet-core-logging
    https://nblumhardt.com/2016/10/aspnet-core-file-logger/
    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1
    如果有什么我可以帮忙的,请随时告诉我。

    【讨论】:

      【解决方案2】:

      IIS 在集成模式下的managed 模块或native IIS 模块中捕获完全在AuthenticateRequest 事件中设置的主体名称。 OWIN uses a special trick “安排”身份验证中间件在 AuthenticateRequest 上运行。看起来在 IIS 日志中设置 cs-username 的唯一方法是在应用程序处理程序 (Global.asax)、自定义模块中设置 Principal,或者使用一些在适当的时间执行此操作的中间件。不幸的是,IAuthenticationFilter 的调用要晚得多。

      Thread.CurrentPrincipal(应用程序身份)在 AuthenticateRequest 之后与 HttpContext.Current.User(网站身份)同步,请参阅https://www.hanselman.com/blog/systemthreadingthreadcurrentprincipal-vs-systemwebhttpcontextcurrentuser-or-why-formsauthentication-can-be-subtle 的评论,这不是用户名未记录的原因。

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        相关资源
        最近更新 更多