none
如何准确捕获WCF身份验证中出现的错误 RRS feed

  • 问题

  • 我定义了一些WCF服务,客户端在访问WCF服务时必须通过身份验证,如果客户端验证正确,那不会发生任何问题,但若客户端验证不正确,WCF提供的信息非常让人费解,我总是只能得到一个通信错误,而且Channel一直处于不可用的出错状态

    我试过用IErrorHandler试图将出错的信息封装发送给客户端,但客户端得不到任何其他相关的信息,除安全验证这第一关外,其他情况下IErrorHandler都能正常捕获错误和处理及封装错误信息

    现在的问题是,应该如何捕获WCF客户进行身份验证时的错误,以便提供给客户操作人员相应的错误处理指引。

    在合用WCF时遇到另一问题,在Web Host时,安全验证无法进入单步调试,但出了安全验证后就可以进入单步,Console Host则可以完成安全验证时的单步调试,请问是Web Host确认不支持验证阶段的单步调试吗?或者存在其他相关设置技巧
    • 已编辑 Corny 2009年10月10日 6:59 改错
    2009年10月10日 6:58

答案

  • 你好,
    我测试了一下,直接在Validate方法中抛出:

    throw

     

    new FaultException("Unknown Username or Incorrect Password");

    在客户端捕获Exception的InnerException就是FaultException.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.
    • 已标记为答案 Corny 2009年10月14日 2:07
    2009年10月12日 3:10
    版主

全部回复

  • Hi,
    看了你的问题。
    1.我感觉可以通过WCF提供的错误处理机制来实现你的需求。具体你实现可以参考WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
    2.Web Host单步调试我没试验过,除非你可以选择Web Host作为附件进程。Console控制台程序可以,客户端单步调试也是在Visual Studio附加进程的方式实现。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月11日 12:56
    版主
  • Hi,
    看了你的问题。
    1.我感觉可以通过WCF提供的错误处理机制来实现你的需求。具体你实现可以参考WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
    2.Web Host单步调试我没试验过,除非你可以选择Web Host作为附件进程。Console控制台程序可以,客户端单步调试也是在Visual Studio附加进程的方式实现。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum

    首先,很感谢您的热情回复,但我想您没有明白我的意思,您给出的链接中的文章总结了常规的异常捕获,但未提供安全异常的捕获问题,就如我在问题中所描述的一样,若是用户验证通过了,那么一切WCF 方法的异常均可以被IErrorHandler捕获,这也是WCF异常捕获中提供的最通用的方式了。但唯一的问题是在第一次访问WCF时的安全验证问题,当然这是建立在Security不是None的情况下。

    具体的说一下,我是用UserNamePasswordValidator来进行客户端安全验证的,服务器使用证书,客户端当然是UserName,无证书,这种情况下,WCF的通信是加密的,按照文档描述,UserNamePasswordValidator在验证出错时,抛出异常供客户端捕获。遗憾的是,此时IErrorHandler捕获不到这种异常,同时,无论我在UserNamePasswordValidator中抛出何种FaultException,客户端得到的总是一个通信错误,而且会引发Channel变成出错状态。即使我在UserNamePasswordValidator中捕获其他类型的错误,并将其包装在FaultException<>,客户端仍然得不到相关的信息,InnerException大多数时候为null,我想知道,除此之外,还有其他什么方式呢。

    需要补充一点的是,我没有对操作施加FaultContract,原因在于安全验证可能发生在任何一个操作中,而我不想对每个操作去重复写一遍FaultContract,这也是我使用IErrorHandler的原因,根据文档描述,这是可以互相替代的方式而已,原则上应该不构成影响。
    • 已编辑 Corny 2009年10月12日 1:25 补充
    2009年10月12日 1:00
  • 你好,
    我测试了一下,直接在Validate方法中抛出:

    throw

     

    new FaultException("Unknown Username or Incorrect Password");

    在客户端捕获Exception的InnerException就是FaultException.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.
    • 已标记为答案 Corny 2009年10月14日 2:07
    2009年10月12日 3:10
    版主
  • 你好,
    我测试了一下,直接在Validate方法中抛出:

    throw

     

    new FaultException("Unknown Username or Incorrect Password");

    在客户端捕获Exception的InnerException就是FaultException.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Welcome to the All-In-One Code Framework http://cfx.codeplex.com/! If you have any feedback, please tell us.

    谢谢你的回复

    你的回复给了我非常好的提示,之前我一直没有想清楚,我当时是如何得到这个错误内容的

    原因是我在客户端代码中加入了using (ClientProxy=...),结果我在Catch段中无论如何也得不到这个Exception.InnerException,有点让人费解,不过也算是基本解决了,非常感谢


    2009年10月14日 2:06