如何处理WCF自定义身份验证的异常?

时间:2011-06-18 22:06:28

标签: wcf authentication exception-handling

我有一个WCF服务,配置为通过系统的重写Validate()方法使用自定义UserName验证。 IdentityModel.SelectorsUserNamePasswordValidator上课。

验证失败时,我抛出一个SecurityTokenValidationException

它的构建方式,在我的客户端,我收到一条带有消息的CommuinicationException:远程服务器返回错误:NotFound。

在客户端处理此异常的最佳方法是什么?

我的验证码:

if (user == null || (Environment.TickCount - user.LastCall) > 300000)
{
    if (!LoginUser.ValidateUser(userName, password))
    {
        throw new SecurityTokenValidationException("Usuário/Senha inválido");
    }
}

2 个答案:

答案 0 :(得分:3)

从服务中抛出异常(我相信)会对通道造成错误,客户端将收到一条非描述性消息。这是设计 - WCF“隐藏”服务端的例外。

要将错误返回给客户端以便客户端可以处理它,您应该使用FaultException。您可以为操作指定FaultContract,并将其返回给客户端。

在WCF中搜索错误处理,你应该得到很多例子。我时间紧迫或者我会添加一些,但希望这会让你指向正确的方向。

已编辑添加

更改行

throw new SecurityTokenValidationException("Usuário/Senha inválido");

throw new FaultException("Usuário/Senha inválido");

抛出FaultException将阻止通信出现故障 - 客户端可以接收异常,知道它是由于验证失败,并决定从该点开始做什么(重试,提示用户重新输入凭据等)

这是一个非常简单的变化,这个例子就是为了说明这一点。我在下面发布的链接将提供更详细的信息。

答案 1 :(得分:0)

您如何识别上次呼叫时检查的用户对象?你在使用LINQ单一电话吗?如果是这样,如果找不到用户,这将抛出异常,因此服务器将在那时中止身份验证而不是使用SecurityTokenValidationException,我认为这会给你看到的行为