在II7上我们托管了一个基于WCF/asp.net的API。为了允许经典asp应用程序的用户连接到API,我们必须发布一个我们称之为"传输"的版本。这个Transport版本也是用asp.net编写的,它指向相同的程序集,只是安全层不同,允许经典asp进行身份验证。使用传输级安全性,而不是基于消息的安全性。
当使用浏览器加载服务引用时,我可以加载svcutil.exe…WDSL页面。
当使用我的测试asp页面从这个引用调用web方法时,我得到以下返回:
已调用Web服务。状态=内部服务器错误ResponseText = a:InvalidSecurityAn验证消息安全性时发生错误。
这表明身份验证失败。当测试使用asp.net或WCF风暴的应用程序,以联系正常的API,一切工作良好。
API最近迁移了,似乎有些东西没有正确设置,但我无法解释是什么。
我可以浏览到svcutil.exe…WDSL服务引用,当通过浏览器选择它时,我得到预期的XML响应。
使用基于消息的安全性使用API的非经典asp发布时使用的用户名和密码。
是否有可能发布一些可能有助于诊断问题的故障排除提示,特别是关于传输级安全故障查找和设置?
谢谢斯科特
编辑添加以下更新:
尝试使用默认应用程序池和新的应用程序池,但同样的问题仍然存在。
我的测试页错误:ResponseText = a:InvalidSecurityAn验证消息安全性时发生错误。
IIS日志显示:V3/transport/testclassicasptransportwcfservice.asp(200 00)(即iis 200)/V3/运输/DeviceService。svc/DeviceService(500 00)(即iis error 500)
注意:在TRANSPORT和V3上定义了虚拟目录。V3使用。net而不是经典的asp进行身份验证。
事件日志:由于以下错误,应用程序池"transport"的模板持久缓存初始化失败:无法为应用程序池创建磁盘缓存子目录。数据可能有额外的错误代码。
这个参考似乎建议修复,但"appcmd"中的许多DIR路径和引用不存在。
_http://theether.net/kb/100127
REF http://theether.net/kb/100127
- 加载cmd提示符
- CD到C:WindowsSystem32inetsrv
- 输入:apppcmd list config -section:system.webServer/asp c:inetpubconftempASP编译模板
- 检查路径是否存在
检查网络服务是否有权限访问"ASP编译模板"如果没有从appcmd执行;
icacls "c:inetpubconftempASP Compiled Templates" /grant "NETWORK SERVICE:(OI)(CI)(M)"
应该读取"成功处理了1个文件"
验证安全性时发生InvalidSecurityAn错误消息"问题仍然存在,但"无法创建磁盘缓存子目录...."事件日志中的错误不再发生。
对不起,又更新了。更改网络服务权限不能解决问题,更改为默认应用程序池解决了问题。
终于有线索了。检查:
- ServiceSecurityAudit设置在服务行为中。Ref http://intrepiddeveloper.wordpress.com/2008/08/07/security-event-logging-auditing/
- IIS日志(仅显示非特定错误500.)
- 故障跟踪启用(也显示错误500)。
- 自定义错误关闭
- IE友好消息关闭
- Asp客户端和服务器端调试 ProcessMon正在运行,没有错误。
- 网络。config httpErrors errorMode=" detail "/> +
ServiceSecurityAudit发现我一个"对象引用没有设置为对象的实例",所以听起来我们的应用程序有一个bug。
跟进(17/08/11):
服务安全审计记录在这里:
http://intrepiddeveloper.wordpress.com/2008/08/07/security-event-logging-auditing/是我们解决这个问题的关键。发现了对象引用错误,该错误表明我们的业务对象和数据访问dll不一致。使用CLASSIC ASP与WCF联系。使用传输身份验证的。NET API,在对该行为启用服务安全审计之前,绝对没有此错误的指示。