WCF UserName身份验证和错误合同

Tal*_*ker 6 authentication wcf soapfault wcf-security

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

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

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

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

"这个错误的创造者没有指明原因."

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

throw new FaultException("Authentication failed.");

我至少会得到"身份验证失败".在原因元素.

我的问题是:

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

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

大里

Ste*_*rew 0

这有点烦人,但我通过这样做解决了这个问题:

SecurityTokenValidationException stve
  = new SecurityTokenValidationException("用户名或密码无效");
抛出新的FaultException<SecurityTokenValidationException>(stve, stve.Message);

包含该消息还意味着您不会收到愚蠢的“未指定原因”消息。