场景:我们有一个内部和外部都可以查看的网站。发生错误时,将显示用户详细的错误页面(堆栈跟踪等)。
问题:外部客户不需要太多关于错误的信息。我们希望让外部客户看到一个消息。防爆。请联系管理员。如果可能的话,我们也希望在SQL数据库中记录此消息。
注意:我假设我创建了一个自定义错误页面,如 - Implementing a Custom Error page on an ASP.Net website,但如何确定用户是否是内部/外部?这也是解决问题的最佳方法吗?此外,如果有人有关于在数据库中存储这些错误的最佳方法的建议,也欢迎。
提前致谢。
答案 0 :(得分:4)
您可以尝试在web.config中设置mode
到RemoteOnly
<customErrors mode="RemoteOnly">
这样本地用户就会看到错误,外部用户会看到您设置的其他错误页面。
这里有一篇关于此类事情的文章http://aspnetresources.com/articles/CustomErrorPages
答案 1 :(得分:1)
我这样做的方法是为外部和内部用户提供不同的入口点。我会通过主机名来做到这一点。通过改变主机名,我可以为每种类型的用户创建自定义错误实验。
答案 2 :(得分:1)
如果您使用'internal'表示已登录,而'external'表示匿名,则可以使用相同的自定义错误页面,但使用Request.IsAuthenticated
检查用户的登录状态
然后,您可以根据用户的状态显示消息。
对于存储错误,您可以使用log4net和/或ELMAH。 ELMHA专门用于捕获未处理的异常。 Log4net主要用于从代码中进行日志记录,即从try / catch语句中进行日志记录。
最好同时使用两者。
答案 3 :(得分:0)
那篇文章正确地说明了你需要做什么。另请参阅:
Web服务器将处理用户是内部还是外部的确定。
答案 4 :(得分:0)
RemoteOnly 的customErrors可能无法帮助您,因为RemoteOnly仅指未从同一物理盒访问该页面的用户。 LAN上的用户将被视为远程用户,就像广域网用户一样。
如果我必须解决您的问题,我将从Application_Error开始并检查Request.UserHostAddress和Request.UserHostName,但即使这些也不会完全可靠,因为在我的企业内部网上,我的10.4.42.219的地址可能很好匹配您的公司内部地址,UserHostName 应该是一个人类可读的名称但它并不总是 - 例如,看它在调试模式下运行,UserHostAddress和UserHostName都将是“127.0 .0.1“当你希望后者成为”localhost“时。
这里看到的问题是,当他们点击你的网络服务器时,他们在防火墙内,而服务器是一个监听器 - 所以无论什么 IP传入连接都是无关紧要的来自(欺骗是一个非常现实的问题),你的网络服务器不会发起一个响应,它将在客户端打开的管道上发送一个响应。
现在,如果您的防火墙可以配置为利用欺骗并强制IP进入特定值,这将是一种可靠的方式来可靠地识别外部连接,并通过消除过程,内部的,但我可以'无论如何都要说明这种方法的可行性。
编辑添加:我怀疑你的初始问题本身可能存在缺陷。我问自己的问题是,你内部的人真的关心错误信息?你的公司秘书是否想要查看堆栈跟踪信息?可能不是。
我怀疑你真正需要的是主动身份验证和基于角色的安全性,这样只有特定标识的用户 - “错误调查员”角色的成员 - 才能看到这些详细的异常,并且其他人,包括内部用户,都可以获得漂亮的自定义页面。