WCF UserName身份验证和错误合同

时间:2009-08-24 14:28:34

标签: wcf authentication wcf-security soapfault

我有一个WCF服务,配置为通过System.IdentityModel.Selectors.UserNamePasswordValidator类的重写Validate()方法使用自定义UserName验证。

合同的所有方法都使用FaultContractAttribute进行修饰,以将自定义SOAP错误指定为可返回的。

当抛出FaultException< T>时,其中T是FaultContractAttribute中指定的类型,一切都按预期运行,我在响应XML中得到自定义错误。

但是,如果我尝试抛出FaultException< T>在用户名认证类的重写Validate()方法中,我得到一个通用的SOAP错误,原因如下:

“此故障的创建者未指定原因。”

但是,如果我更改代码以抛出一般SOAP错误,如:

throw new FaultException("Authentication failed.");

我至少会得到“身份验证失败”。在原因元素。

我的问题是:

  • 为什么不是FaultException< T>如果它们在服务实现中被抛出在Validate()中,则异常处理相同吗?
  • 是否可以让Validate()方法中抛出的异常符合合同方法中指定的FaultContractAttribute?

任何帮助非常感谢。我自己的猜测是,在消息与合同的任何方法相关联之前进行身份验证,因此,与FaultContractAttribute没有关联,但是任何确认这一点并给出解决方法的文章都非常有用。

塔利

2 个答案:

答案 0 :(得分:0)

这有点令人讨厌,但我做到了这一点:

SecurityTokenValidationException stve 
  = new SecurityTokenValidationException("Invalid username or password");
throw new FaultException<SecurityTokenValidationException>(stve, stve.Message);

另外包含该消息意味着您没有得到愚蠢的“没有指定原因”的消息。

答案 1 :(得分:0)

问题是自定义验证代码是在任何特定OperationContract的上下文之外运行的,因此WCF没有FaultContract处理的位置。所以简短的回答是否定的,你不能从你的自定义验证器中获得例外来尊重FaultContract

这里有几个选项。我更喜欢的是抛弃非泛型FaultException并提供预先确定的FaultCode;通过这种方式,我的catch块可以将合同故障与“管道”故障区分开来。请注意,您从自定义验证程序中抛出的任何异常都应该以{{1​​}}的形式返回,如下所示:

MessageSecurityException
相关问题