我有一个WCF服务,配置为通过系统的重写Validate()方法使用自定义UserName验证。 IdentityModel.Selectors
。 UserNamePasswordValidator
上课。
验证失败时,我抛出一个SecurityTokenValidationException
。
它的构建方式,在我的客户端,我收到一条带有消息的CommuinicationException
:远程服务器返回错误:NotFound。
在客户端处理此异常的最佳方法是什么?
我的验证码:
if (user == null || (Environment.TickCount - user.LastCall) > 300000)
{
if (!LoginUser.ValidateUser(userName, password))
{
throw new SecurityTokenValidationException("Usuário/Senha inválido");
}
}
答案 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,我认为这会给你看到的行为