匿名用户调用时,Web 服务无法写入事件日志

Posted

技术标签:

【中文标题】匿名用户调用时,Web 服务无法写入事件日志【英文标题】:Web service cannot write to Event Log when called by anonymous user 【发布时间】:2009-07-22 20:26:56 【问题描述】:

总结:如何配置 Web 服务以便始终可以写入事件日志(无论调用者如何)? 细节: 我有一个向应用程序日志写入条目的 Web 服务。我通过一个小控制台应用程序为此建立了事件源,我想我理解这部分内容。当我测试这个 WS 时,我看到我成功地将我的条目写入事件日志。

承载此 WS 的虚拟目录允许匿名访问,并且仅配置为集成 Windows 身份验证。

我有一个调用此 Web 服务的 Web 客户端应用程序。当 Web 客户端站点仅配置为集成 Windows 身份验证时,对 Web 服务的调用会根据需要生成日志记录。

但是,如果我将 Web 客户端站点更改为允许匿名访问,则 Web 服务尝试记录会导致 InvalidOperationException。我忽略了它,但如果知道如何登录 web 服务,不管它是如何被调用的,那就太好了。这是我的一些代码:

   public FileService()
    
        try
        
            if (!EventLog.SourceExists(g_EventSource))
                EventLog.CreateEventSource(g_EventSource, g_EventLog);

            System.Security.Principal.WindowsIdentity UserIdentityInfo;
            UserIdentityInfo = System.Security.Principal.WindowsIdentity.GetCurrent();
            string AuthType = UserIdentityInfo.AuthenticationType;

    if (AuthType == "Kerberos")
     engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    else
     engineWSE.Credentials = new System.Net.NetworkCredential("u", "p", "domain"); 

    EventLog.WriteEntry(g_EventSource,
                "Caller: " + UserIdentityInfo.Name +
                " AuthType: " + UserIdentityInfo.AuthenticationType,
                EventLogEntryType.Information, 1);
        
        catch (InvalidOperationException e)
        
            // do nothing to ignore: "Cannot open log for source 'myAppSourceName'. You may not have write access." 
        
    

上面构造函数中的示例在这里有点做作(我主要感兴趣的是能够写出与 Web 服务中的错误相关的信息)。

我希望有一种方法可以配置 Web 服务虚拟目录(或其中的代码),以便无论如何调用都可以进行日志记录。

【问题讨论】:

【参考方案1】:

允许网络服务to write to the Event Log,但不能创建事件源。您可以授予 HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\ 权限以允许它创建 - 但如果您已经在安装时创建了它,则无需。

SourceExists 也有可能失败 - 因为这需要枚举相同的注册表项。我可能会删除 SourceExists/Create 检查并相信它存在 - 如果您是匿名的,则无论如何您都无法创建它。

【讨论】:

【参考方案2】:

您还应该检查您的 web.config。

如果 IIS 设置为匿名且 web.config 设置为 windows/impersonate。然后它将是试图写入事件日志的匿名 IIS 用户。

【讨论】:

谢谢。根据您的回答,我仔细阅读了我的问题。我确实在托管我的网络服务的网站的 web.config 中有 和 。我需要这个,因为我需要 INTRAnet webclient 的身份(请参阅我如何测试身份验证类型并相应地传递凭据)。那么,您是说因为 web.config 中的“模拟”,它的行为就好像我为我的 web 服务站点检查了“匿名访问”?我想你会说是的。鉴于我的目标,无论如何都要配置它以进行日志记录? 您需要授予 IIS 匿名用户写入事件日志的权限。它的名字是IUSR.... 我知道如何为 IUSR_SERVERNAME 设置文件或文件夹的权限,但如何赋予该帐户写入事件日志的权限? 它需要编辑注册表,详情请参阅:blogs.msdn.com/ericfitz/archive/2006/03/01/541462.aspx。 感谢您,我在以下链接中找到了以下详细信息:support.microsoft.com/kb/301309 将以下注册表项设置为 0 而不是 1,然后重新启动计算机以使更改生效。 HKLM\System\CurrentControlSet\Services\EventLog\Application 名称:RestrictGuestAccess 类型:REG_DWORD 注意:这使所有来宾帐户都可以写入应用程序事件日志。

以上是关于匿名用户调用时,Web 服务无法写入事件日志的主要内容,如果未能解决你的问题,请参考以下文章

服务器事件查看器里面全部是ANONYMOUS LOGON这个账户的登陆日志

Linux:服务器:我在root目录下建一个abc文件,用FTP测试连接时用匿名用户登录,put

在匿名代理后面获取用户ip

获取匿名代理后面的用户 ip

Web-Lesson07-JS的函数及作用域

搭建FTP服务